2016-01-16 33 views
-1

例如,使用一個通用的比較時使用它 - Comparator<? super T> c爲什麼我們在java中使用「?super T」?

我明白,這基本上意味着,比較器將比較T和它的超類,我不明白不過其背後的邏輯。 爲什麼不使用「? extends T」?或者,例如,我發現有人詢問有關「List<? super Number>」的類似問題 - 這是否意味着該列表將接收Number對象及其超類?但是Number的超類是Object,這是否意味着該列表可以接收任何Object?

+0

請參閱有效的Java項目28:http://squidsquad.org/e/java/8/Effective-Java-2nd-Edition.pdf –

+0

這裏可能有一個很好的問題,但它沒有縮小範圍並從這是如何構成的,這是不明顯的你已經閱讀了關聯的問題。如果您可以查看鏈接的問題,那麼使用更多的代碼做一個具體的例子,那麼這可能會更好。 –

回答

-1

這並不意味着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 

IntegerDouble二者延伸Number。他們是Number的子類。所以他們可以被添加到數字列表中。

NumberObject的子類。如果你看看源代碼,它沒有明確地擴展任何東西(儘管它實現了Serializable)。這意味着它的超級班級是Object。我們不能將一個對象添加到數字列表中。

Object o2 = 300; 
numbers.add(o2); // compilation error 
numbers.add((Number) o2); // no compilation error once we cast it 

事實上,我們可以,如果它是一個Number添加Object。當然,所有的Number都是Objects,儘管不是所有的Object都是Numbers。但是,如果它被宣佈爲Object,那麼我們首先必須將其投射到Number

+0

你可以添加代碼示例來顯示你的意思嗎?現在,你的答案不清楚(至少對我而言)還是錯誤的。 – Pshemo

+0

對不起,應該是'它可以接收任何數字的子類'而不是'它可以接收任何列表的子類'。 –

+0

你能澄清你在這裏「接收」的意思嗎?真的,簡短的可編譯和可執行的例子在這裏會很好。 – Pshemo

相關問題