[英]Java Generic type : difference between List <? extends Number> and List <T extends Number>
[英]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.