簡體   English   中英

通配符和變異器方法

[英]Wildcard and mutator methods

當看到以下片段時,我感到非常困惑:

class Animal {}

class Dog extends Animal {}

public class Test {

    public static void main(String[] args) {
        List<? super Animal> list = new ArrayList<>();
        list.add(new Dog());  //it's OK
        list.add(new Animal()); //and this is OK too
    }
}

為什么允許這樣的事情? 當我將列表更改為List<? super Dog> list = new ArrayList<>(); List<? super Dog> list = new ArrayList<>(); list.add(new Animal());發生編譯時錯誤 使用extends通配符時,所有組合都會導致錯誤。 誰能說出這種行為的確切原因? 提前致謝。

    List<? super Animal> list = new ArrayList<>();
    list.add(new Dog());  //it's OK
    list.add(new Animal()); //and this is OK too

上面的代碼應被允許:因為狗也是動物。

    List<? super Dog> list = new ArrayList<>();
    list.add(new Dog());  //it's OK
    list.add(new Animal()); //error

上面的代碼是錯誤的,應該再次出現,因為不是每只動物都是狗。

inheritance就是這么簡單。 :)

注意:要完成答案,請參閱:

[ 之間的區別<? 超級T>和<? 在Java 1中 擴展T>

暫無
暫無

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

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