我在這裏用泛型掙扎着。泛型 - 調用一個通用參數的方法
要開始做事了,我想通過以下回調接口返回對象的列表:
回調接口:
public interface ArrayCallback<T> {
public void onComplete(List<T> result);
}
到目前爲止好。現在,使用該回調,讓我們說我想要得到的歌曲列表,像這樣:
使用回調加載的歌曲
public void loadSongs(ArrayCallback<Song> callback) {
List<Song> songs = new ArrayList<Song>();
...
callback.onComplete(songs);
}
這裏沒有問題的列表。但是現在我想加載一些類型的音樂項目。它可能是以前的歌曲,但它可能是專輯,藝術家等。我稱之爲所有這些類型的事物的超類。MusicItem
。 (因此,Song
有一個超類MusicItem
)這是它跌倒的地方。
Aaaaand以下不起作用
public void loadMusicItems(MusicItemType type, ArrayCallback<? extends MusicItem> callback) {
switch (type) {
case Songs:
loadSongs(callback);
break;
case Albums:
loadAlbums(callback);
break;
default:
break;
}
的問題是在loadSongs(callback)
線。我不能調用這個方法,因爲類型是不同的。
loadSongs(ArrayCallback<Song>) in MusicSource cannot be applied to loadSongs(ArrayCallback<capture<? extends MusicItem>>)
從我的理解,我不能只是使用類型T
,並且需要使用,因爲協方差問題通配符。
我甚至有可能做什麼?在寫出這個問題之後,如果我突然限制方法調用的邊界,我認爲對編譯器來說可能會有些奇怪。除了可能是瘋狂的方法設計之外,我仍然有興趣研究我做錯了什麼。
Song是否繼承MusicItem? –
是的。對不起,也許這並不明確。 – JRod
'class ArrayCallback' - 這是否工作? –
RandomQuestion