[英]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
特定的處理程序,或者可以使用特定類型的超類型滿足的更多通用處理程序。
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.