Node的ArrayList是否包含非Node类型?

时间:2008-10-16 00:48:52

标签: java

Node的ArrayList是否包含非Node类型?

使用类型转换是否有一种非常脏的方法?

3 个答案:

答案 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的情况下使用它呢?