Node的ArrayList是否包含非Node类型?
使用类型转换是否有一种非常脏的方法?
答案 0 :(得分: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 :(得分: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);
至少,该解决方案将向其他人表明他们必须要注意Object的任何子类都可以在列表中。
答案 2 :(得分:0)
假设您使用Generic来创建ArrayList,可以使用反射将非节点添加到其中,因为在运行时期间不会保留类型信息。
取决于如何从ArrayList中获取对象,可能会遇到ClassCastException。
如果您确实需要在ArrayList中使用非特定类型,那么为什么不在没有Generic的情况下使用它呢?