[英]Using 2 levels of generics in an Abstract Class definition
我有這個通用接口:
public interface TjbListener<T> {
public void hearChange(T t);
}
我這樣使用:
public interface ObjectOneListener extends TjbListener<ClassOne> {
}
我想寫一個抽象的泛型類A,它以泛型U作為參數並具有方法(1),該方法本身在U上調用方法(2)。下面是我的嘗試,U應該擴展(或實現?)通用的TjbListener接口。
public abstract class ListenerInformer<U extends TjbListener<"what should I write here">> {
List<U> mListeners = new ArrayList<U>();
public void addListener(U u){
mListeners.add(u);
}
public void informAll("what should I write here"){
for(U u:mListeners){
u.hearChange("what should I write here");
}
}
}
我在寫此問題時想到的一個解決方案如下,但我不知道它是否真的是一種解決方案,或者是否存在我不理解的細微問題:
public abstract class ListenerInformer<U extends TjbListener<T>,T> {
List<U> mListeners = new ArrayList<U>();
public void addListener(U u){
mListeners.add(u);
}
public void informAll(T t){
for(U u:mListeners){
u.hearChange(t);
}
}
}
更新:注意
我剛剛發現,這種方法對於我的特殊情況幾乎是無用的,因為相同的類無法使用不同的參數實現相同的接口。 請參閱下面的鏈接問題。 這意味着我不能使用我的(或Johanna的)解決方案讓一個類成為兩種不同類型的偵聽器,而不使用像組合這樣的不同策略。
您的第二個示例應該工作。 但是,如果那樣簡單,那么就不需要Generic U,因為TjbListener的子類的每個實例也是TjbListener的實例。
您可以做得更簡單:
public abstract class ListenerInformer<T> {
List<TjbListener<T>> mListeners = new ArrayList<TjbListener<T>>();
public void addListener(TjbListener<T> u){
mListeners.add(u);
}
public void informAll(T t){
for(TjbListener<T> u:mListeners){
u.hearChange(t);
}
}
}
這與您的代碼一樣工作,並且更易於處理。
如果需要TjbListener子類的最終實現類型作為parameter的返回值,則需要兩個泛型類型,例如,如果有
public U informAll2(T t){
for(U u:mListeners){
u.hearChange(t);
if (...)
return u;
}
}
在這種情況下,使用兩種泛型類型的聲明是正確的(只是我不確定是否可以在聲明T之前聲明依賴於T的泛型U,或者是否必須先聲明T,例如public abstract class ListenerInformer<T, U extends TjbListener<T>>
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.