gpt4 book ai didi

Java 8。泛型。使用原始类型。意外的类型转换

转载 作者:行者123 更新时间:2023-12-03 18:48:21 29 4
gpt4 key购买 nike

假设我有一个原始类型 声明为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 值。 (如果我对 list1list2 使用无限通配符会更安全,并且会出现编译错误)。然而,这是一个原始类型。

现在让我们使用这个方法如下:

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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com