1.概念
泛型,即参数化类型,目的是将具体类型参数化,在使用时需要传入具体类型进行替换
注意:对象.getClass()方法返回包含指定对象所属类的 Class 对象
public class Demo {
public static void main(String[] args) {
List<String> list1 = new ArrayList();
list1.add("String");
List<Integer> list2 = new ArrayList<>();
list2.add(1);
System.out.println(list1.getClass()==list2.getClass());//true
System.out.println("list1集合:"+list1.getClass());//class java.util.ArrayList
}
}
2.指定泛型不指定泛型区别
主要区别在于类型安全性和代码可读性。
-
指定泛型:
- 当我们指定泛型时,比如
List<String>
,编译器会在编译期间进行类型检查,确保集合中只能存储指定类型的元素。这可以提高代码的类型安全性,避免在运行时出现类型转换异常。 - 指定泛型还可以增加代码的可读性,让其他开发者更容易理解代码的意图,同时也能减少在编写代码时的错误。
- 当我们指定泛型时,比如
-
不指定泛型:
- 如果不指定泛型,比如
List
,则表示该集合可以存储任意类型的元素,相当于使用原始类型。在这种情况下,编译器无法进行类型检查,可能导致在运行时出现类型转换异常。 - 不指定泛型会降低代码的类型安全性,因为无法保证集合中存储的元素类型是否符合预期,需要开发者在使用时自行确保类型的正确性。
- 如果不指定泛型,比如
注意:不报错的Number是Integer,Double的父类,同一父类的最小级,直到Object
而add4是因为 Integer 与 Boolean 同父类就只是Object类
3.类型擦除带来的问题
在编译期间,泛型信息会被擦除,编译后的字节码中将不再包含具体的泛型类型信息。因此,在运行时无法获取泛型类型的具体信息。但是对于需要明确指定泛型类型参数的情况,编译器无法根据上下文推断出类型,因此需要显式地指定类型参数,这时候就需要使用类名来调用泛型方法。
文章很详细,直接参考即可