2012-05-23 38 views
2

我很安靜地進入java中的泛型。我有一個名爲RIEngine的接口。通配符(?)工作,而類型「T」不在泛型中 - 爲什麼?

我嘗試下面的例子:

private <T> boolean allExist(List<T extends RIEngine> resultedList, 
          String... columnName) 
{ ... } 

不能編譯。

private <T> boolean allExist(List<? extends RIEngine> resultedList, 
          String... columnName) 
{ ... } 

編譯。

我的問題是:爲什麼這樣。

爲什麼我不能使用type =「T」而不是通配符?

請幫我理解。

+0

請出示一個小例子,不編譯(你可以在不事先聲明的類型的方法使用)。 –

+0

Sun有一個非常好的教程:http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html。另外,順便說一下,http://stackoverflow.com/questions/3486689/java-bounded-wildcards-or-bounded-type-parameter –

+0

的確切副本,在第二個示例中,您根本沒有使用「T」 。所以'私人布爾allExist(列表<?擴展RIEngine>的結果列表,字符串... columnName)'是足夠的。如果方法的內部不需要使用'T',那麼使用不帶'T'的通配符就更簡單了。 – newacct

回答

9

試試這個:

private <T extends RIEngine> boolean allExist(List<T> resultedList, String... columnName){... 

你需要把你的類型限制在類型聲明,不使用它的。

第二個編譯的原因是因爲它是一個通配符

+0

謝謝,我明白了...... – Hasan

+0

+1比我快27秒:)請接受這個答案。我在發佈帖子後才注意到它。 – Stephan

相關問題