2013-08-27 61 views
3

類型T和對象有什麼區別?類型T和對象有什麼區別?

換句話說,List<T>List<Object>之間有什麼區別?

+0

T =泛型類型累加器 –

+0

開始閱讀:http://docs.oracle.com/javase/tutorial/java/generics/ –

回答

6

在運行時,沒有區別:Java泛型通過Type Erasure實現,所以在所有實現中都使用相同的類。

然而,在編譯時,差異是巨大的,因爲它可以讓您避免每次使用對象時進行強制轉換,使代碼看起來更清晰。

考慮這個例子:

List<Integer> list = new ArrayList<Integer>(); 
list.add(1); 
list.add(2); 
list.add(3); 
for (Integer n : list) { 
    System.out.println(n+5); 
} 

這編譯並運行良好,也容易閱讀。如果你想使用List<Object>相反,代碼就不會顯得乾淨:

List<Object> list = new ArrayList<Object>(); 
list.add(1); 
list.add(2); 
list.add(3); 
for (Object o : list) { 
    // Now an explicit cast is required 
    Integer n = (Integer)o; 
    System.out.println(n+5); 
} 

內部,雖然,兩個代碼段用於其list對象完全相同的實現。

1

List<T>被稱爲泛型,因此保證List將始終包含T類型的對象。而另一個不保證對象是相同類型的,實際上你只知道它們是對象。

0

List<T>是泛型類的名稱。 List<Object>是它的具體實例。 List<T>還不是一個類(它是一個通用類,可以創建具體類的模板,但不是可以立即使用的類),List<Object>是一個類。

+0

這根本沒有意義。 –

0

T是一個類型參數。這意味着其他一些代碼可以聲明某種類型,並且使用該類型參數的類的代碼將在其實現中替換該類型的T。

所以,你可以創建自己的類Foo和聲明包含FOOS作爲列表:

List<Foo> foos = new ArrayList<Foo>(); 

,你可以調用像

Foo foo = foos.get(0); 

方法沒有投,因爲編譯器知道了該列表在foos對象上的get方法的方法返回類型中用Foo代替T.

相關問題