2011-09-27 47 views
10

爲什麼有什麼區別?和T在類和方法簽名?

public interface ArrayOfONEITEMInterface <T extends ONEITEMInterface>{ 
    public List<T> getONEITEM(); 
} 

編譯,但不

public interface ArrayOfONEITEMInterface <? extends ONEITEMInterface>{ 
    public List<?> getONEITEM(); 
} 

之間有什麼區別?和T在類和方法簽名?

回答

17

?是通配符並且意味着任何子類別ONEITEMInterface包括其本身。

T具體的在這種情況下執行ONEITEMInterface

由於?是通配符,也沒有關係,你的?在類的聲明,並在方法聲明中,因此它不會編譯?。只需List<?> getONEITEM();即可編譯。


第一場景意味着整個類可以處理恰好一個類型Bar實例的。

interface Foo<T extends Bar> { 
    List<T> get(); 
} 

第二場景允許每個實例操作任何亞型Bar

interface Foo { 
    List<? extends Bar> get() 
} 
1

的T是用於將由一個執行或實例化類提供一個類型的佔位符。

?是一個佔位符,表示「我不知道或關心什麼是泛型類型」,通常在您對容器對象執行的工作不需要知道類型時使用。

你不能使用'?'的原因在類/接口定義中是因爲它的價值在於定義佔位符的名稱(並且類型將在別處提供)。把'?'沒有意義。

此外,佔位符並不需要是T,它可以是任何標準的Java變量。按照慣例,它是一個大寫字母,但不一定是。

0

?允許你有一個未知類型的列表,其中T需要一個確定的類型。

2

條款<T extends ONEITEMInterface>正在聲明名爲T的類型參數。這允許您的泛型類型ArrayOfONEITEMInterface在其他地方引用該參數。例如,你可以聲明一個像void add(T t)這樣的方法。

沒有命名類型參數,你會如何引用它?如果你永遠不會引用類型參數,爲什麼你的類型是通用的?例如,你並不需要一個參數化類型,以做這樣的事情:

public interface ArrayOfONEITEMInterface { 
    List<? extends ONEITEMInterface> getONEITEM(); 
} 

它沒有意義的聲明匿名類型的參數,所以它在語法上是不合法的。

相關問題