2012-04-27 93 views
0

我有這樣的通用接口,使用2級仿製藥:在抽象類定義

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); 
     } 
    } 
} 

UPDATE:謹防

我剛剛發現,這種做法對我的具體情況幾乎是無用的,因爲同一類無法實現用不同的參數相同的接口。看到下面鏈接的問題。這意味着我不能用一個類作爲我的(或約翰娜的)解決方案的兩種不同類型的聽衆,而不使用不同的組合策略。

How to make a Java class that implements one interface with two generic types?

+0

我想知道,你嘗試了什麼問題解決?它看起來有點過度設計... – aviad 2012-04-27 06:03:00

+1

我認爲你的解決方案是好的 – 2012-04-27 06:04:40

+0

我第二,你的解決方案很好,我不同意@aviad,它沒有被過度強調。 – Snicolas 2012-04-27 06:05:37

回答

3

你的第二個例子應該工作。但是,如果它如此簡單,那麼就不需要通用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的子類的最終實現類型作爲參數的返回值,例如,如果你有

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>>

+0

,這對我來說確實起作用,因爲我沒有返回任何東西。謝謝您的深入解釋 – tjb 2012-04-27 08:22:55

+0

oops,抱歉,您的解決方案存在另一個問題,我之前沒有看到:輸入到addListener的參數未經過類型檢查。 T的值必須已經在TjbListener接口中指定爲listenChange的輸入參數,這是不正確的。 – tjb 2012-04-27 08:30:01

+0

是的,你說得對。我忘了參數化TjbListener。我添加了缺失的''。現在應該會更好。 – Johanna 2012-04-27 08:44:06