簡體   English   中英

在抽象類定義中使用2級泛型

[英]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的)解決方案讓一個類成為兩種不同類型的偵聽器,而不使用像組合這樣的不同策略。

如何制作一個實現兩種通用類型的接口的Java類?

您的第二個示例應該工作。 但是,如果那樣簡單,那么就不需要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.

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