Java中集合的实例化通常如下:
ArrayList<Integer> ali = new ArrayList<Integer>();
据说,按照这个约定,某些错误例如
String s = (String)ali(0)
可能导致编译错误而不是运行时异常。
但是,我观察到,虽然
ArrayList ali = new ArrayList<Integer>();
会导致上面的情况引起运行时异常,
ArrayList<Integer> ali = new ArrayList();
上述情况仍然会导致编译时错误。
是否有什么我错过的,或者如果我们不关心代码的清晰度,我们可以忽略右侧的类型吗?
谢谢!
最佳答案
ArrayList<Integer> ali = new ArrayList();
和
ArrayList ali = new ArrayList<Integer>();
这将生成一个编译器警告:未检查的转换。如果您不忽略这些警告,或者使用注释抑制它们,因为您可以证明它是安全的,那么您只能获得泛型的编译安全性。
您提出了一个有趣的观点:
ArrayList<Integer> ali = new ArrayList();
由于您只会使用 ali,因此您的引用确实安全。但是,您将在表达式的右侧收到编译器警告,因此最好添加参数化类型并使编译器免受警告。编译器警告您的原因是因为有人可能会这样做:
ArrayList<String> strings = new ArrayList<String>();
ArrayList<Integer> integers = new ArrayList(strings);
哦,不,你现在已经在整数中添加了字符串!
这就是 Java 7 类型推断的用武之地
ArrayList<Integer> ali = new ArrayList<>();
因此不再需要指定参数化类型,因为 Integer 是推断出来的。您可以在 Java 5 或 6 中通过编写一个泛型方法(例如 makeArrayList()
)来推断类型(请参阅 Joshua Bloch effective Java 书)
关于java - 如果在集合实例化期间未指定类型参数之一,会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6279833/