Mic*_*key 5 java collections generic-collections
我正在尝试学习泛型类型的使用,当我尝试使用某些代码行时,我注意到了一些奇怪的东西.
第一段代码位于名为"A"的类中:
public void func(int k, List list) {
list.add(9);
list.add(true);
list.add("a string");
}
Run Code Online (Sandbox Code Playgroud)
第二段代码在main函数内的不同类中:
List<Integer> arr = new ArrayList<Integer>();
arr.add(14);
System.out.println(arr.toString());
a.func(8, arr);
System.out.println(arr.toString());
Run Code Online (Sandbox Code Playgroud)
运行代码会导致打印以下行:
[14]
[14,9,true,一个字符串]
这让我非常困惑,因为它arr是一个ArrayList类型Integer,它如何包含类型的对象boolean和String?是否将函数中的列表转换为func原始类型(这意味着它变为泛型类型Object)?如果是这样,怎么可能,因为你不能这样做,例如:List<Integer> arr = new ArrayList<Object>();?
希望对此有所澄清,也许它会帮助我更好地掌握这类通用类型的主题.谢谢!
Java 不允许创建泛型数组。Java集合类主要使用Object数组来实现。ArrayList 类可能如下所示
public class ArrayList<T> implements List<T>, Serializable {
private transient Object[] data;
// more content...
}
Run Code Online (Sandbox Code Playgroud)
创建新实例时,会创建一个可以保存任何类型对象的ArrayList新数组。Object[]类型安全只能通过使用通用类型参数来实现。
由于 List 没有提供任何 Type 参数,因此它使用 ,rawtype并且可以将任何内容添加到列表中。因此,始终确保推断模板参数以保持类型安全。
public void func(int k, List<Integer> list) {
list.add(9); // works
list.add(true); // compile error
list.add("a string"); // compile error
}
Run Code Online (Sandbox Code Playgroud)
你永远不应该使用rawtypes. 根据您的编译器设置,警告将被忽略。最好使用(绑定/未绑定)通配符。