总之,我可能对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)型来满足的更通用处理程序。
关于java - 为什么Java Generic不能设计继承到父Generic类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19358685/