簡體   English   中英

為什么Java Generic無法設計繼承到父Generic類?

[英]Why Java Generic can't design to inherit to a parent Generic class?

所有,我可能對Java的泛型有一些基本的誤解,

為什么我們不能編寫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未定義

聲明您的DefaultHttpExecutor構造函數為

public DefaultHttpExecutor(ResponseHandler<? super T> responseHandler)

這是因為您試圖為MeetingClientResponse創建一個DefaultHttpExecutor ,但是您要MeetingClientResponse傳遞一個針對JsonResponse的處理程序。

使用該聲明,您聲明執行者將可以使用MeetingClientResponse特定的處理程序,或者可以使用特定類型的超類型滿足的更多通用處理程序。

另請參閱什么是PECS(生產者擴展了超級消費者)?

DefaultHttpExecutor<T>構造函數需要一個ResponseHandler<T>參數。 更准確地說,它需要一個聲明ResponseHandler<T> 因此,您需要將處理程序聲明ResponseHandler<MeetingClientResponse<ScheduleMeetingResponseVO>> (或子類型):

ResponseHandler<MeetingClientResponse<ScheduleMeetingResponseVO>> handler;

我強調聲明一詞,因為聲明很重要。 如果您的處理程序被聲明為ResponseHandler<JsonResponse<ScheduleMeetingResponseVO>> ,即使您實際上是一個ResponseHandler<MeetingClientResponse<ScheduleMeetingResponseVO>> ,也會收到編譯錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM