簡體   English   中英

泛型-調用具有泛型參數的方法

[英]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.

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