2008-10-16 72 views

回答

5

是的,但如果您嘗試訪問非節點元素就好像它是節點一樣,您將得到類轉換異常。泛型在(for)運行時被丟棄。

例如:

import java.util.*; 
import java.awt.Rectangle; 

public class test { 
    public static void main(String args[]) { 
     List<Rectangle> list = new ArrayList<Rectangle>(); 
     /* Evil hack */ 
     List lst = (List)list; 

     /* Works */ 
     lst.add("Test"); 

     /* Works, and prints "Test" */ 
     for(Object o: lst) { 
      System.err.println(o); 
     } 

     /* Dies horribly due to implicitly casting "Test" to a Rectangle */ 
     for(Rectangle r: list) { 
      System.err.println(r); 
     } 
    } 
} 
1

鑑於:

List<Node> nodelist = new ArrayList<Node>(); 
    Object toAdd = new Object(); 

然後:

((List) nodelist).add(toAdd); 

((List<Object>) nodelist).add(toAdd); 

會做黑客。伊克。我覺得很骯髒。但是,你不應該這樣做。如果你真的需要混合類型,那麼這樣做:

List<Object> mixedList = new ArrayList<Object>(list); 
    mixedList.add(toAdd); 

這一解決辦法,至少,會顯示給他人,他們必須提防對象的任何子類可以在列表中。

0

假設您使用泛型來創建ArrayList,您可以使用反射將非節點添加到它中,因爲在運行時不會保留類型信息。

取決於如何將對象從ArrayList中取出,您可能會遇到ClassCastException。

如果你真的對ArrayList中的非特定類型有需求,那麼爲什麼不使用它就沒有Generic?

相關問題