Q1:List <String> list = new LinkedList () 为什么创建链表时可以不指定泛型?
Java中,当你创建一个集合类实例,理想情况下应该明确指定泛型类型,这样可以享受泛型带来的类型安全和编译时检查的好处。然而, List<String> list = new LinkedList()
没有在创建 LinkedList
实例时明确指定泛型类型,但这行代码依然可以编译通过。这是因为在Java的类型推断机制中,编译器会根据左边的变量声明类型来进行泛型类型的推断。
具体到这个例子,因为左侧 List<String>
已经指定了泛型为 String
,编译器能够推断出右侧创建的 LinkedList
也应该使用相同的泛型类型 String
。所以,虽然没有显式写出 new LinkedList<String>()
,但实际效果上是等同的,编译器会自动加上泛型信息。
Q2: List<Double>list=new LinkedList();
list.add(5.3); 泛型是Double类,为什么可以向链表中添加double类型数据?
double
是基本数据类型,而 Double
是 double
的封装类。Java支持自动装箱和拆箱功能,这使得基本数据类型和它们对应的包装类之间可以自动转换。
自动装箱是Java编译器自动将基本数据类型转换为对应的封装类对象的过程。在这个例子中,double
值 5.3
被自动转换成 Double
对象,然后添加到集合中。
自动装箱和拆箱功能解决了泛型不能直接使用基本类型的问题。这使得在使用泛型集合时,可以通过自动装箱将基本类型转换为它们对应的封装类,从而允许基本类型的“间接”使用。