![](/img/trans.png)
[英]Java generics: Calling generic Method “…is not applicable for the arguments…”
[英]Generics - Calling a method with a generic parameter
我在這里與泛型作斗爭。
首先,我想通過以下回調接口返回對象列表:
回調界面:
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
的超類)。
Aaaa,以下內容無效
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類型的枚舉與Album類型的ArrayCallback一起傳遞。 (想象一下,您的loadSongs方法將收到專輯類型的ArrayCallback。沒辦法!)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.