2013-07-01 56 views
1

我有docs.oracle網站閱讀,如果沒有泛型下面的代碼片段需要鑄造:什麼好處泛型提供了遺留代碼:

List list = new ArrayList(); 
list.add("hello"); 
String s = (String) list.get(0); 

,但如果我用泛型寫代碼,那麼它仍然是容易到錯誤:

List<Object>= new List<Object>; 
list.add("hello"); 
String s=(String)list.get(0); 

的是那麼真實的使用泛型....提前:(日Thnx在..

+2

'列表'會阻止您添加非'string'項目。田田! – dlev

+0

typesafety!.... – Anirudha

回答

4
List<Object>= new List<Object>; 
list.add("hello"); 
String s=(String)list.get(0); 

應該

List<String>= new ArrayList<String>(); // this is now a list of String, not a list of object 
    ^^^^^^     ^^^^^^ 
list.add("hello"); 
String s=list.get(0); // no casting needed 
     ^

你可以通過你想要的類型參數。你的例子有兩種方法可以做同樣的事情,因爲你用最基本的類來參數化。

泛型的優點是您可以編寫更特定於一個類的類,String這裏。這爲您提供更好的類型安全性,以便在編譯期間儘早捕獲錯誤。這可以防止鑄造方法引起的問題。

+0

這裏有一個錯字'新的列表;' –

+0

好吧,我明白了......這意味着我可以將特定的數據類型添加到容器對象。和編譯器在編譯時檢查它...很好 –

3

使用泛型使您的代碼類型安全。您可以阻止ClassCastException

3

假設你想存儲的名稱列表(字符串)

List listNames = new ArrayList(); 
listNames.add("Durgesh");//ok 

但我還可以添加一個整數它

listNames.add(5000);//storing int instead of string 

現在做這個

String name2=listNames.get(1);//throws exception{int->string} 

無泛型,你可以添加無效的類型集合,這可能會破壞你的代碼。


隨着泛型你能解決這個問題

List<String> listNames = new ArrayList(); 
listNames.add("Durgesh"); 
listNames.add(3000);//would through error at compile time 

因此,仿製藥提供類型安全


隨着List<Object>你打算任何Object.Due的增加對象參數,它將允許你添加任何類型的對象(string,int)。


此外List<x>不能assinged(=)至List<y>,或反之亦然,如果x可以被轉換爲y或可轉化爲x..They都應該是X或Y,從而提供式安全

所以,你將無法分配=List<String>List<Object>反之亦然..

1

仿製藥使用在編譯時間本身來檢測運行時異常。

假設您創建了一個List存儲Strings並傳遞給方法.. enhanceList(List) ..和執行後,你會遍歷列表,並得到所有字符串

genercis,它可能之前已經可能enhanceList(List)方法添加的對象其他類型進入名單有可能會產生ClassCastException

void someMethod() { 
    List listOfStrings = new List(); 
    enhanceList(listOfStrings); 

    for(Iterator i : listOfStrings.iterator(); i.hasNext();) { 
     String s = (String) i.next(); //RuntimeException here 
    } 
} 

void enhanceList(List l) { 
    l.add(new Integer(1)); //error code 
} 

泛型,可以很好地「綁定」對象的類型列表中包含

void someMethod() { 
    List<String> listOfStrings = new List<String>(); 
    enhanceList(listOfStrings); 

    for(String s : listOfStrings) { 
     //no error here 
    } 
} 

void enhanceList(List<String> l) { 
    l.add(new Integer(1)); //compile-time error 
} 

然而,仿製藥應謹慎使用,List<Object>沒有太大的幫助與綁定類型,因爲它可以持有任何對象(因爲Object是所有java類的超類)。我建議始終創建特定類型列表。

相關問題