2014-07-22 60 views
0

我在這裏用泛型掙扎着。泛型 - 調用一個通用參數的方法

要開始做事了,我想通過以下回調接口返回對象的列表:

回調接口:

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,並且需要使用,因爲協方差問題通配符。

我甚至有可能做什麼?在寫出這個問題之後,如果我突然限制方法調用的邊界,我認爲對編譯器來說可能會有些奇怪。除了可能是瘋狂的方法設計之外,我仍然有興趣研究我做錯了什麼。

+0

Song是否繼承MusicItem? –

+0

是的。對不起,也許這並不明確。 – JRod

+0

'class ArrayCallback ' - 這是否工作? – RandomQuestion

回答

2

泛型類型將僅在編譯期間應用(以確保類型安全)並在運行期間消失。所以你的實現實際上違反了泛型類型的用法。例如。您可以使用Album類型的ArrayCallback傳遞一個Song類型枚舉。 (想象一下你的loadSongs方法將會收到一個Album類型的ArrayCallback,不會!)

+0

那是非常有意義的。謝謝! – JRod

相關問題