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

标签 java generics raw-types

假设我有一个原始类型 声明为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/

相关文章:

java - JDBC : Batch insert not inserting value to database

c# - 如何从 C# 中的嵌套泛型类继承泛型类

java - 什么是原始类型,为什么我们不应该使用它呢?

java - 将参数化类型实例引用到其原始类型与使用原始类型引用另一个原始类型实例之间的区别?

oop - 使用泛型参数覆盖Dart方法

java - 什么是原始类型,为什么我们不应该使用它?

java - gwt 专注于流程面板或任何其他面板

java - 如何使用终端推送 Github 存储库?

java - 将 24 位位图数据正确加载到 32 位位图对象中

c# - 未为动态泛型解析方法