0

すべて、Java の Generic について基本的な誤解があるかもしれませんが、

親の Generic クラスを継承する Java Generic Son クラスを作成できないのはなぜですか?

次のように定義します。

public class JsonResponse<T> implements Response {
}

しかし、それを継承する別の息子クラスを定義します。

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

別の呼び出し元クラスを次のように定義します。

public interface HttpExecutor<T extends Response> {
}

impl it クラスは次のとおりです。

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)

これは、 for を作成しようとしているのに、DefaultHttpExecutorforMeetingClientResponseであるハンドラーをそれに渡しているためJsonResponseです。

その宣言により、エグゼキュータが に固有のハンドラMeetingClientResponse、または特定の種類のスーパータイプで満足できるより一般的なハンドラで動作できるようになると述べています。

PECS (Producer Extends Consumer Super) とは?も参照してください。

于 2013-10-14T12:21:48.073 に答える