簡體   English   中英

泛型中的通配符:“? 超級T”有效,而“? 延伸T”不是嗎?

[英]Wildcards in Generics: “? super T” works while “? extends T” does not?

我的問題是關於Java 7中的泛型的。假設我們有這樣的類層次結構:

interface Animal {}    
class Lion implements Animal {}    
class Butterfly implements Animal {}

就像在Java泛型教程中一樣

我們還有一堂課

class Cage<T> {
    private List<T> arr = new ArrayList<>();
    public void add(T t) {
        arr.add(t);
    }
    public T get() {
        return arr.get(0);
    }
}

這是使用該類的代碼:

public static void main(String[] args) {
        Cage<? extends Animal> cage = new Cage<>();
        Animal a = cage.get(); //OK
        cage.add(new Lion()); //Compile-time error
        cage.add(new Butterfly()); //Compile-time error   
    }

問題1:

我在這里已經閱讀有關這些問題的信息,但是就像Cage<?> 但是我告訴編譯器<? extends Animal> <? extends Animal>因此Cage<T> T類型將是Animal類型的任何子類型。 那么為什么它仍然給出編譯時錯誤?

問題2:

如果指定Cage<? super Animal> cage = ... Cage<? super Animal> cage = ...而不是Cage<? extends Animal> cage = ... Cage<? extends Animal> cage = ...一切正常,編譯器沒有說不好。 為什么在這種情況下它可以正常工作而在上面的示例中卻失敗了?

籠子必須能夠容納兩種動物。 “ super”說-它說籠子必須能夠容納所有類型的動物-也許還有其他一些東西,因為? super Animal ? super Animal可能是? super Animal的超類。 “擴展”表示它可以容納某些動物-例如,也許只是獅子,例如:

Cage<? extends Animal> cage = new Cage<Lion>();

這將是一個有效的聲明,但很明顯,獅子籠不會容納蝴蝶,所以

cage.add(new Butterfly());   

不會編譯。 該聲明

cage.add(new Lion());

也不會編譯,因為Java在這里查看籠子的聲明Cage<? extends Animal> Cage<? extends Animal> -不是現在分配給它的對象( Cage<Lion> )。

我所知道的對泛型的最佳描述是在O'Reilly的《 Java in a Nutshell》中 本章是免費在線- 第1 部分第2部分

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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