所谓擦拭法是指,虚拟机对泛型其实一无所知,所有的工作都是编译器做的。Java的泛型是由编译器在编译时实行的,编译器内部永远把所有类型T视为Object处理,但是,在需要转型的时候,编译器会根据T的类型自动为我们实行安全地强制转型。
1.dog类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Dog {
private String name;
private int age;
private String color;
}
2.Person类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
private String name;
private int age;
private String gender;
}
3.GenericParadigmEraseTest类
public static void main(String[] args) {
Dog dog = new Dog("huahua", 12, "灰");
Person person = new Person("小红",23,"女");
List<Person> personList = new ArrayList<>();
List<Dog> dogList = new ArrayList<>();
//测试,不能存放
//personList.add(dog);
System.out.print("personList.getClass() == dogList.getClass() : " );
System.out.println(personList.getClass() == dogList.getClass());
}
编译时报错,需要的是Person类型,而提供的是Dog类型。
将编译报错的内容注释掉,运行
可以看到personList和dogList的class()是一致的。
Java编译器是通过先检查代码中泛型的类型,然后再进行类型擦除,再进行编译。所以在编译时添加会报错,而结果是二者是一致的。