2011-11-08 345 views
67

我見過以前用來表示任何對象通配符 - 但最近看到使用:<?>和<?是什麼區別?在Java泛型中擴展Object>?

<? extends Object> 

因爲所有的對象擴展的對象,是這兩種用法的代名詞?

+2

這是一回事。請參閱http://stackoverflow.com/questions/2274720/java-extends-object-question – Dan

+3

@丹如果您在該問題中搜索「?extends Object」,則無法找到任何內容。我正在閱讀答案,看看我是否可以推斷任何事情,但我不認爲這是事實。具體來說,這不是在談論泛型。 – orbfish

+0

@丹 - 這是一個不同的問題。我之前見過這個問題,我記得至少提到了一個微妙的區別。讓我看看我是否可以找到它.. –

回答

77

<?><? extends Object>是同義詞,正如您所期望的那樣,但是有幾種情況下,其中extends Object實際上並不是多餘的。例如,<T extends Object & Foo>將導致T在擦除下變爲Object,而使用<T extends Foo>它將在擦除下變爲Foo。 (這可以,如果你想保留與仿製藥前的API,用於Object兼容性問題)。

(來源:http://download.oracle.com/javase/tutorial/extra/generics/convert.html,它解釋了爲什麼JDK的java.util.Collections類與此簽名的方法:

public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) 

。)

+4

我不清楚這個例子是如何關聯的? (因爲它既不使用也不使用<?extends Object>) – orbfish

+5

+1非常有趣。 –

+22

@orbfish:它只涉及到我認爲你會發現它很有趣,因爲它是'擴展Object'實際上*是*有意義的一個例子。如果我錯了,那我很抱歉。希望至少在其他人遇到你的問題時會引起他們的興趣。 – ruakh

17

雖然<?>應該是爲<? extend object>一個快捷方式,還有就是兩者之間的細微差別。 <?>可以確認,而<? extend object>不可以。他們這樣做的原因是爲了更容易區分可定義類型。任何看起來像<? extends something><T>,<Integer>的東西都是不可接受的。

例如,該代碼會工作

List aList = new ArrayList<>(); 
boolean instanceTest = aList instanceof List<?>; 

但是這給出了一個錯誤

List aList = new ArrayList<>(); 
boolean instancetest = aList instanceof List<? extends Object>; 

更多信息由莫里斯·納夫特爾林

+0

如果編譯器將它翻譯爲列表,那麼列表如何可以被賦值,以便了解有關什麼是類型的信息?丟失了? – Trismegistos

+0

我相信更適合向後兼容傳統API。 與和<?擴展了Java 5代碼的Object>。 –

2

<?>閱讀Java泛型和集合是一個速記<? extends Object>。 您可以閱讀下面的共享鏈接瞭解更多詳情。


<?> 

"?"表示任何未知類型,它可以在用於代碼代表任何類型。如果您對Type不確定,請使用此通配符。

ArrayList<?> unknownList = new ArrayList<Number>(); //can accept of type Number 
unknownList = new ArrayList<Float>(); //Float is of type Number 

注:<?>意味着anythings。所以能接受從Object類繼承的Type。

<? extends Object> 

<? extends Object>意味着可以通過一個對象或延伸Object類的子類。

ArrayList<? extends Number> numberList = new ArrayList<Number>(); //Number of subclass 
numberList = new ArrayList<Integer>(); //Integer extends Number 
numberList = new ArrayList<Float>(); // Float extends Number 

enter image description here

筆 - 用於表示類型
ë - 用於表示元件
的K - 鍵
N - 值
N - 對數字
Ref:

enter image description here

相關問題