2011-09-12 66 views
0
public static void main(String[] args) { 
     Set vals = new TreeSet(); 
     vals.add("one"); 
     vals.add(1); 
     vals.add("two"); 
     System.out.println(vals); 
} 

(I) - 什麼意思定義集合沒有給它一個類型?爲了什麼目的 它的製作?定義集合不特定類型

(ii) - 我可以以任何方式爲集合添加不同的類型?

下面是一個例子 - 沒有編譯錯誤,雖然它警告我。

但是,如例外,有運行時錯誤。

回答

2
  1. 定義集合(或任何類型化的類)而不指定類型參數是使用原始類型調用的。它存在只有向後兼容,不應在新代碼中使用。如果有效地消除類型上的所有泛型效應。
  2. 通常,您可以將您的設置定義爲接受Object:然後它會接受所有值:Set<Object> vals = new HashSet<Object>()但是這不適用於TreeSet,因爲它需要它的值爲Comparable彼此。 如果你想要添加任意類型到相同的TreeSet(這通常是一些架構問題的標誌,即設計氣味),那麼你需要實現你自己的Comparator,它可以比較任意元素並將其傳遞到the appropriate TreeSet constructor
+1

'設置瓦爾斯=新TreeSet的()'會吹了一個'ClassCastException'如果先添加一個'Integer',然後嘗試了'String'添加到它 –

+0

@Sahil Muthoo:哎呀我沒想到居然TreeSet'的'具體來說,你說得對,我已經澄清了,現在 –

+0

集a_set_that_can_be_initialized_to_whatever_generic_type是不一樣的設置 a_set_that_can_only_be_initialized_to_generic_type_Object –

1

i)這意味着它可以有任何物體。如果你想添加任何類型。 (通常是設計問題)

ii)使用類型擦除,你可以。

但是,如例外,有運行時錯誤。

在編譯時獲取錯誤通常比獲取運行時錯誤要好。 (更容易找到並修復)

1

Upto Java 1.4沒有泛型。所有集合只能包含Object,並且在將對象從集合中取出之後,您必須對對象進行分類。所以,你會做

Set vals = new Treeset(); 
String s = (String)vals.get(0); 

,而不是

Set<String> vals = new Treeset<String>(); 
String s = vals.get(0); 

把不同類型的沒有共享的接口或超類對象是非常不好的做法,因爲你不會知道如何當你把它拿出來處理對象的集合。

1
private Set<JPanel> s1; 

public void run() { 
    aMethod(s1); 
} 

/* line 7 */ public void aMethod(Set panels) { 

} 

如果你重構改變七號線上面的代碼

public void aMethod(Set<Object> panels) { 

將不再編譯。如果您重構該行

public void aMethod(Set<?> panels) { 

它仍然會像以前一樣編譯,並作爲額外的獎勵,你將不再有「設置爲原料...「警告

+0

好點!你永遠不要低估重構你的重要性準備的重要性碼。 – aviad