0

所有,我可能对 Java 中的 Generic 有一个基本的误解,

为什么我们不能写一个 Java Generic 子类来继承它的父 Generic 类?

定义如:

public class JsonResponse<T> implements Response {
}

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

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

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

public interface HttpExecutor<T extends Response> {
}

实现它的类是:

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 未定义

4

2 回答 2

1

将您的DefaultHttpExecutor构造函数声明为

public DefaultHttpExecutor(ResponseHandler<? super T> responseHandler)

这是因为您正在尝试创建一个DefaultHttpExecutorfor MeetingClientResponse,但您传递给它的处理程序是 for JsonResponse

通过该声明,您声明执行程序将能够使用特定于 的处理程序MeetingClientResponse,或更通用的处理程序,这些处理程序可以满足特定类型的超类型。

另请参阅什么是 PECS(生产者扩展消费者超级)?

于 2013-10-14T12:21:48.073 回答
0

构造DefaultHttpExecutor<T>函数需要一个ResponseHandler<T>参数。更准确地说,它需要一个声明为 a的参数ResponseHandler<T>。因此,您需要将处理程序声明ResponseHandler<MeetingClientResponse<ScheduleMeetingResponseVO>>(或子类型):

ResponseHandler<MeetingClientResponse<ScheduleMeetingResponseVO>> handler;

我强调了声明这个词因为声明才是最重要的。如果你的处理程序被声明为 a ResponseHandler<JsonResponse<ScheduleMeetingResponseVO>>,你会得到一个编译错误,即使你的处理程序实际上是 a ResponseHandler<MeetingClientResponse<ScheduleMeetingResponseVO>>

于 2013-10-14T11:50:07.323 回答