请解释一下List - raw类型和List<Object>的区别。
下面的代码给出了运行时错误:
public static void main(String[] args) {
List<String> strings = new ArrayList<String>();
unsafeAdd(strings, new Integer(42));
String s = strings.get(0); // Compiler-generated cast
}
private static void unsafeAdd(List list, Object o) {
list.add(o);
}这给出了编译时错误:
public static void main(String[] args) {
List<String> strings = new ArrayList<String>();
unsafeAdd(strings, new Integer(42));
String s = strings.get(0); // Compiler-generated cast
}
private static void unsafeAdd(List<Object> list, Object o) {
list.add(o);
}发布于 2014-02-20 23:16:03
在第二种情况下,你正在做一些编译器可以解决的不安全的事情。在第一种情况下,您使用的是原始类型,因此编译器不会执行相同的检查。
发布于 2014-02-20 23:20:10
Java没有对参数类型的继承。因此,List<Integer>不是List<Object>的子类,因此不能使用List<Integer>或List<String>作为unsafeAdd方法的参数。但是你可以这样写:
private static <T> void unsafeAdd(List<T> list, T o) {
list.add(o);
}安全地叫它:
List<String> strings = ...
unsafeAdd(string, "42");并在执行以下操作时出错:
List<String> strings = ...
unsafeAdd(strings, 42); // error!您可以在Oracle Generics Tutorial, Generics, Inheritance, and Subtypes中查看更多信息
发布于 2014-02-20 23:20:14
在第一种情况下,您将非参数化列表传递给unsafeAdd,因此编译器无法发现错误。
向期望List的方法传递List<String>是可以的。将对象添加到List是可以的。
在第二种情况下,你将List<String>传递给需要List<Object>的方法--这是不对的。因为以这种方式,您隐含地允许将非字符串添加到List<String> -编译器可以在这种情况下找出它并引发错误。
https://stackoverflow.com/questions/21911871
复制相似问题