例如,使用一個通用的比較時使用它 - Comparator<? super T> c
爲什麼我們在java中使用「?super T」?
我明白,這基本上意味着,比較器將比較T和它的超類,我不明白不過其背後的邏輯。 爲什麼不使用「? extends T
」?或者,例如,我發現有人詢問有關「List<? super Number>
」的類似問題 - 這是否意味着該列表將接收Number對象及其超類?但是Number的超類是Object,這是否意味着該列表可以接收任何Object?
例如,使用一個通用的比較時使用它 - Comparator<? super T> c
爲什麼我們在java中使用「?super T」?
我明白,這基本上意味着,比較器將比較T和它的超類,我不明白不過其背後的邏輯。 爲什麼不使用「? extends T
」?或者,例如,我發現有人詢問有關「List<? super Number>
」的類似問題 - 這是否意味着該列表將接收Number對象及其超類?但是Number的超類是Object,這是否意味着該列表可以接收任何Object?
這並不意味着T及其超類。它意味着T及其子類。 所以不行,列表不能接收任何Object,它可以接收任何Number的子類。
List<? super Number> numbers = new ArrayList<>();
Integer i = 23;
Double d = 3.14;
Object o = new Object();
numbers.add(i);
numbers.add(d);
numbers.add(o); // compilation error
Integer
和Double
二者延伸Number
。他們是Number
的子類。所以他們可以被添加到數字列表中。
Number
是Object
的子類。如果你看看源代碼,它沒有明確地擴展任何東西(儘管它實現了Serializable
)。這意味着它的超級班級是Object
。我們不能將一個對象添加到數字列表中。
Object o2 = 300;
numbers.add(o2); // compilation error
numbers.add((Number) o2); // no compilation error once we cast it
事實上,我們可以,如果它是一個Number
添加Object
。當然,所有的Number
都是Object
s,儘管不是所有的Object
都是Number
s。但是,如果它被宣佈爲Object
,那麼我們首先必須將其投射到Number
。
請參閱有效的Java項目28:http://squidsquad.org/e/java/8/Effective-Java-2nd-Edition.pdf –
這裏可能有一個很好的問題,但它沒有縮小範圍並從這是如何構成的,這是不明顯的你已經閱讀了關聯的問題。如果您可以查看鏈接的問題,那麼使用更多的代碼做一個具體的例子,那麼這可能會更好。 –