2011-10-13 50 views

回答

3

<?>語法是Java的方法來指定該通用類型是「無界」 - 即它可以是「任何」。

Enumeration<?>是帶有「無界類型」枚舉 - 可以在任何類型的枚舉分配給這樣的變量,例如:然而

Vector<String> v = new Vector<String>(); 
Enumeration<String> es = v.elements(); 
Enumeration<?> e = es; // This assignment compiles OK 

,是無界的,所述nextElement()方法Enumeration<?>返回類型爲Object(即使它實際上是一個Enumeration<String>),所以你可能要投:

String s = (String)e.nextElement(); // Unsafe cast - compiler warning 


有關背景,Enumeration是一種帶有兩種方法的分型接口hasMoreElements()nextElement()。這是一個早期(差)嘗試,被IterableIterator取代。有幾個老班使用它,如VectorStringTokenizer

+0

...和Servlet API:p –

0

?是通配符。你可以把它表示爲?擴展對象或具有相同效果的類別的東西。從我的理解來看,通配符到目前爲止並不完全是一門藝術,在java中它們需要有一定的限制*但是不要在此引用我

2

問號表示它代表所有類型。下面是一個example

除了具體的實例有所謂的通配符 實例。它們沒有具體的類型作爲類型參數,但是所謂的通配符是 。通配符是一個帶有「 ?」的句法結構,它不僅表示一種類型,而且表示一種類型。在其最簡單的形式 通配符只是一個問號,代表「所有 類型」。

(的通配符參數化的類型)實施例:

public void printPair(Pair<?,?> pair) { 
System.out.println("("+pair.getFirst()+","+pair.getSecond()+")"); 
} 

Pair<?,?> limit = new Pair<String,Long> ("maximum",1024L); 
printPair(limit); 
2

雖然很容易想到?表示「any」或「all」類型,但它實際上指定了單個未知類型。如果它真的是「任何」,你會期望這個工作:

List<?> l = ... 
l.add("foo"); 
l.add(new Date()) 

但它沒有。這是因爲該代碼中的類型是未知的,所以編譯器無法判斷是否允許向其添加任何內容。