簡體   English   中英

Java中的通用類型和通配符

[英]Generic types and wildcards in Java

我在Java中使用泛型創建了以下類,對此有一些疑問:

 public class Averias<T, E> {

    private ArrayList<T> averias;
    private E prueba;
    private ArrayList<? extends T> animal;

    public Averias(ArrayList<T> averias, E prueba, ArrayList<? extends T> animal) {
        this.averias = averias;
        this.prueba = prueba;
        this.animal = animal;
    }

    public ArrayList<T> getAverias() {
        return averias;
    }

    public void setAverias(ArrayList<T> averias) {
        this.averias = averias;
    }

    public E getPrueba() {
        return prueba;
    }

    public void setPrueba(E prueba) {
        this.prueba = prueba;
    }

    public ArrayList<? extends T> getAnimal() {
        return animal;
    }

    public void setAnimal(ArrayList<? extends T> animal) {
        this.animal = animal;
    }
}

這是我的課程,現在我的第一個疑問是:當我想使用此類時,我是否必須推斷所有類型,還是只能使用一個?

private Averias<Integer, String> averias;

如果我推斷所有類型都行得通,但我認為每次我想使用它時都需要推斷大量類型的代碼,那么我不知道是否有一些我不知道的簡單方法。

在該類中,我有一個帶有通配符的ArrayList:private ArrayList animal;。 我仍然不清楚通配符如何工作,我知道可以將其與擴展名或super一起使用,並取決於其工作方式,但是我不知道何時使用通配符會很有用。

推論是可行的,但是如果您推論推論,那么它就是全部或什么都沒有。 您不能指定一半的泛型參數,而將另一半推斷出來。 要使用推論,您需要菱形運算符。 例如,給定:

void foo(Averias<String, Integer> a);

你可以寫:

thingie.foo(new Averias<>());

並推斷<String, Integer>位。 對於類型為args的靜態方法,無需任何其他語法即可進行推理,因此無需在其中使用<>

對於字段,不能使用推斷。 private Averias<Integer, String> averias它是不可避免的。

對於通配符:

使用泛型時,繼承規則更加嚴格。 例如,這:

Number x = new Integer(5);

是合法的Java。 但是,如果我們將其通用化:

List<Number> x = new ArrayList<Integer>();

不是合法的 –泛型是“不變的”,意味着只有在左右兩側都相同的情況下,它才會起作用。 List<Number> x = new ArrayList<Integer>()有效。 也許您會覺得很奇怪,但這是正確的:事實是,有了列表,您也可以寫信給他們。 並且,您可以將Double寫入List<Number> (畢竟,double是數字),但是.. double不是整數。 因此,為什么它如此工作。

如果需要協方差,您仍然可以這樣做,這就是通配符出現的地方。這是合法的:

List<? extends Number> x = new ArrayList<Integer>();

那么“加倍”問題會怎樣? 容易:您無法將任何內容添加List<? extends whatever> List<? extends whatever> (好吧,除了null總是可以的)。

super是為了求逆。 Integer x = new Number的有效概念。 有了矛盾性,您可以將內容添加到列表中,但是如果從列表中get ,則總是可以得到一種Object

List<? super Integer> x = new ArrayList<Number>(); // legal
x.add(new Integer(10)); // Okay
x.add(someNumber); // illegal
Object z = x.get(0); // that works; anything other than Object would not

super是迄今為止最罕見的。

暫無
暫無

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

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