我見過以前用來表示任何對象通配符 - 但最近看到使用:<?>和<?是什麼區別?在Java泛型中擴展Object>?
<? extends Object>
因爲所有的對象擴展的對象,是這兩種用法的代名詞?
我見過以前用來表示任何對象通配符 - 但最近看到使用:<?>和<?是什麼區別?在Java泛型中擴展Object>?
<? extends Object>
因爲所有的對象擴展的對象,是這兩種用法的代名詞?
<?>
和<? 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)
。)
雖然<?>
應該是爲<? 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>;
更多信息由莫里斯·納夫特爾林
如果編譯器將它翻譯爲列表
我相信>更適合向後兼容傳統API。 與
<?>
閱讀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
筆 - 用於表示類型
ë - 用於表示元件
的K - 鍵
N - 值
N - 對數字
Ref:
這是一回事。請參閱http://stackoverflow.com/questions/2274720/java-extends-object-question – Dan
@丹如果您在該問題中搜索「?extends Object」,則無法找到任何內容。我正在閱讀答案,看看我是否可以推斷任何事情,但我不認爲這是事實。具體來說,這不是在談論泛型。 – orbfish
@丹 - 這是一個不同的問題。我之前見過這個問題,我記得至少提到了一個微妙的區別。讓我看看我是否可以找到它.. –