2008-10-16 67 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?

相关问题