如何在列表中存储参数化的侦听器?

时间:2017-04-18 22:34:33

标签: android

我有一个听众:

public interface OnCompleteListener<T> {
    void onComplete(T data);
}

我将它存储在列表中:

private List<OnCompleteListener<?>> mListeners = new ArrayList<>();

// ...

public void addType1Listener() {
    addListener(new OnCompleteListener<Type1>() {
       //...

});     }

public void addType2Listener(){         addListener(new OnCompleteListener(){            // ... });     }

private <T> void addListener(OnCompleteListener<T> listener) {
    mListeners.add(listener);
}

我试图通过这种方式得到它:

public <T> OnRequestsCompleteListener<T> get(int i) {
    return (OnRequestsCompleteListener<T>) mListeners.get(i);
}

Type1和Type2没有父类,也没有。 但我得到了“未经检查的演员”。警告。如何正确使用?

1 个答案:

答案 0 :(得分:0)

不需要在方法中指定遗传T,而是需要具有通用T

的类
public class ListenerCollection <T> {

    private List<OnCompleteListener<T>> mListeners = new ArrayList<OnCompleteListener<T>>();


    public void addListener(OnCompleteListener<T> listener) {
        mListeners.add(listener);
    }

    public OnCompleteListener<T> get(int i) {
        return mListeners.get(i);
    }
}

假设您有一个类 OnRequestCompleteListener ,则实现OnCompleteListener<String>。然后你做:

   ListenerCollection<String> lcollection;

   ...........

   OnRequestCompleteListener newListener = (OnRequestCompleteListener) lcollection.get(i);

没有任何警告。