簡體   English   中英

List <Number>和List <有什么區別?擴展數>?

[英]What is the difference between List<Number> and List<? extends Number>?

我有一個關於Java泛型的非常基本的問題。 我認為List<Number>List<? extends Number> List<? extends Number>是同質的。 我是對的還是有一些我缺少的基礎?

泛型類型更迂腐。

<? extends Number> <? extends Number>表示Number或未知的子類。 如果您獲得這樣的值,它將是一個Number ,但您不能給出這種類型的值,因為您不知道哪個是有效的。

不同之處在於參數和返回值。

List<Number> numbers = new ArrayList<Number>();
Number n = 1;
numbers.add(n); // ok.
n = numbers.get(0); // ok
numbers.add(1); // ok.

List<? extends Number> numbers2 = new ArrayList<Double>();
numbers2.add(n); // not ok
n = numbers2.get(0); // ok

List<? super Number> numbers3 = new ArrayList<Serializable>();
numbers3.add(n); // ok
n = numbers3.get(0); // not ok.

super在幾個地方用來表示類型可以是超類型。 例如

在集合中,此方法表示比較器需要能夠比較相同類型或任何超類型。

public static <T> void sort(List<T> list, Comparator<? super T> c)

這意味着你可以擁有

Comparator<Number> comparesAnyNumbers = ...
List<Integer> ints = ...
Collections.sort(ints, comparesAnyNumbers);

泛型是編譯時語言的特性,意味着它們在運行時不存在。 在通用機制中,對於編譯時檢查,它們不是同類的,即如果要在泛型類型中使用多態。

下面給出了編譯時錯誤,雖然它似乎是一個有效的定義:

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

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

已驗證。 而且,您不能在右側使用通配符類型:

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

不會被編譯。

List<Number> - >的列表Number S(或實例Number

List<? extends Number> List<? extends Number> - >列出任何擴展Number類型

暫無
暫無

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

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