Avatar ·

Java泛型中的raw type是什么以及为什么应该避免使用它们?

大家好!我是一名初学Java的开发者,正在学习泛型,偶然遇到了一个奇怪的概念“raw type”(原始类型)。我似乎明白这与泛型有关,但还没有完全理解其本质。 假设我有这样一段代码: ```java List list = new ArrayList(); // 这是raw type吗? list.add("字符串"); list.add(123); ``` 编译器会发出警告,但代码可以运行。我可以往列表里放任何东西。但如果我使用参数化类型: ```java List list2 = new ArrayList<>(); list2.add("字符串"); // list2.add(123); // 编译错误 ``` 那么编译器会报错。区别在哪里?为什么raw type被认为是不好的实践?毕竟代码也能运行。我听说raw type是为了向后兼容而存在的,但为什么要在新代码中使用它们?它们与类型擦除(type erasure)有什么关系? 请给出一些例子,说明使用raw type可能导致运行时错误,而这些错误在编译阶段无法捕获。