java - 为什么Java Generic不能设计继承到父Generic类?

标签 java generics inheritance

总之,我可能对Java中的泛型有一个基本的误解,

为什么我们不能编写一个Java泛型子类来继承其父泛型类?

定义如:

public class JsonResponse<T> implements Response {
}

但我定义了另一个子类来继承它:

public class MeetingClientResponse<T> extends JsonResponse<T> {
}

我将另一个调用者类定义为:

public interface HttpExecutor<T extends Response> {
}

impl它的类是:

public class DefaultHttpExecutor<T extends Response> implements HttpExecutor<T> {
       public DefaultHttpExecutor(ResponseHandler<T> responseHandler) {
    this.responseHandler = responseHandler;

}
}

public class JsonResponseHandler<T> implements ResponseHandler<JsonResponse<T>> {
}

public class ScheduleMeetingResponseHandler extends
    JsonResponseHandler<ScheduleMeetingResponseVO> {
}

handler = ScheduleMeetingResponseHandler.newIntance()

当我这样使用时,没有编译错误:

HttpExecutor<JsonResponse<ScheduleMeetingResponseVO>> httpExecutor = 
new DefaultHttpExecutor
         <JsonResponse<ScheduleMeetingResponseVO>>(handler);

但是当我这样使用时,它会在 Eclipse 中编译错误:

HttpExecutor<MeetingClientResponse<ScheduleMeetingResponseVO>> httpExecutor = 
new DefaultHttpExecutor
          <MeetingClientResponse<ScheduleMeetingResponseVO>>(handler);

Eclipse 提示错误为:构造函数 DefaultHttpExecutor 未定义

最佳答案

将您的 DefaultHttpExecutor 构造函数声明为

public DefaultHttpExecutor(ResponseHandler<? super T> responseHandler)

这是因为您尝试为 MeetingClientResponse 创建一个 DefaultHttpExecutor,但您正在向其传递一个用于 JsonResponse 的处理程序>。

通过该声明,您可以声明执行程序将能够使用特定于 MeetingClientResponse 的处理程序,或者可以使用特定类型的父类(super class)型来满足的更通用处理程序。

另请参阅What is PECS (Producer Extends Consumer Super)?

关于java - 为什么Java Generic不能设计继承到父Generic类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19358685/

相关文章:

generics - Kotlin继承/泛型声明

java - 拆分大的测试方法

java - Android FireStore 以列表形式检索

java - 从Java API获取mapreduce作业结果,而无需在HDFS上永久存储

class - Flutter类继承

c++ - 关于我项目中的抽象类

c# - 为什么派生类中必须保护抽象方法?

java - ElasticSearch索引,更新API

java - 在 Jackson 的 JsonDeserializer 中获取检测到的泛型类型

java - 设置<?不允许使用 extends MyClass> 作为对象声明