[英]Unchecked or Unsafe Operation error with Array of ArrayLists
当我在下面声明ArrayLists的Array时,它可以正确编译,但是有一个警告,指出“未检查或不安全的操作”。 Node是我在公共类中创建的内部类。
private ArrayList<node>[] arr = new ArrayList[5];
我已经尝试了以下两种方法,但都没有编译:
private ArrayList<node>[] arr = new ArrayList<node>[5];
private ArrayList<node>[] arr = new ArrayList<>[5];
这是什么问题? 感谢您的任何帮助。
泛型类型是未定义的。 也就是说,它们是虚拟的,在运行时不可用。 对于实例, ArrayList<String>
在运行时变为ArrayList
。 编译代码时,所有通用信息都将被删除。
另一方面,数组被保留,这意味着它们在运行时保留了更多信息。 因此,在运行时,您只有new ArrayList[5]
。 这就是为什么编译器不允许这样做。
这些操作是非法的,因为它们类型不安全。
private ArrayList<node>[] arr = new ArrayList<node>[5];
private ArrayList<node>[] arr = new ArrayList<>[5];
如果合法,则编译器生成的强制转换可能会在运行时失败。 这将违反通用类型系统提供的基本保证。
数组在运行时知道它们的组件类型,并且每次在数组上设置非空引用时,它都会在运行时检查引用所指向的对象是数组组件类型的实例。 如果不是,则保证抛出ArrayStoreException
。
Object[] foo = new Integer[42];
foo[0] = "bar"; // throws ArrayStoreException -- "bar" is not an instance of Integer
但是,由于对象在运行时不知道其类型参数,因此无法检查对象是否为参数化类型的实例。 在运行时只能检查一个对象是否是某种类型的实例; 这就是为什么只允许将数组组件类型作为类型化的原因。
您仍然可以创建原始类型的数组,并将其分配给参数化类型的数组的类型,如下所示:
private ArrayList<node>[] arr = new ArrayList[5];
或者,您可以创建一个无界通配符类型的数组(也已对其进行修饰),然后将其显式转换为参数化类型的数组类型:
private ArrayList<node>[] arr = (ArrayList<node>[])new ArrayList<?>[5];
在这两种情况下,都会出现未经检查的警告。 通过警告您,这意味着您应对可能发生的不良事件负责。 例如:
Object[] foo = arr;
foo[0] = new ArrayList<String>(); // no ArrayStoreException -- it is an instance of ArrayList
// now you have an ArrayList<node>[] that contains an ArrayList<String>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.