作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个原始类型 声明为List (list1) 的类。这只是一个简单的例子:
public class Wildcards {
public boolean contains(List list1, List<?> list2){
/*for(Object element: list1) {
if (list2.contains(element)) {
return true;
}
}*/
list1.add("12sdf34"); //insert String
return false;
}
}
在 list1 中,我插入了 String 值。 (如果我对 list1 和 list2 使用无限通配符会更安全,并且会出现编译错误)。然而,这是一个原始类型。
现在让我们使用这个方法如下:
List<Integer> list1 = new ArrayList<Integer>();
List<Double> list2 = new ArrayList<Double>();
System.out.println("Contains? " + (new Wildcards()).contains(list1, list2));
System.out.println("List1 element: " + list1.get(0));
我不会收到任何错误并收到以下结果:
Contains? false
List1 element: 12sdf34
谁能解释一下我将 list1 初始化为整数列表时的情况?
最佳答案
在运行时,泛型类型参数是erased ,你可以有效地认为这意味着参数类型被交换为对象。因此,如果编译成功,您可以将任何类型的任何对象添加到任何列表。
所有泛型类型检查都在编译时完成,编译器不能为原始类型引发错误,否则为 Java 1.4(泛型之前)或更早版本编写的代码不会编译。因此,相反,它会引发“原始类型”警告。
关于Java 8。泛型。使用原始类型。意外的类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50022958/
我是一名优秀的程序员,十分优秀!