泛型信息只存在于代码编译阶段,在进入JVM之前,与范型相关的信息会被擦出掉,专业术语叫做类型擦除:
一个参数的类型擦除:
class Person <T>{
private T message;
public T getMessage() {
return message;
}
public void setMessage(T message) {
this.message = message;
}
public void testMethod1(T t){
System.out.println (t );
}
}
public class TestDome {
public static void main(String[] args) {
Person<Integer> person1 =new Person <> ();
Person<String > person2 =new Person <> ();
System.out.println (person1.getClass ()==person2.getClass () );
}
运行结果
打印结果为true,因为My Class<integer>和My Class<String>在JVM中的Class都是MyClass.class.都属于T类下的。
两个参数的类型擦除
class MyClass1<T,E>{
private T age;
private E name;
public T getAge() {
return age;
}
public void setAge(T age) {
this.age = age;
}
public void testMethod2(T t){
System.out.println (t );
}
public E getName() {
return name;
}
public void setName(E name) {
this.name = name;
}
public void testMethod3(E e){
System.out.println (e );
}
public static void main(String[] args) {
MyClass1<Integer,String> myClass=new MyClass1 <> ();
MyClass1<String ,Integer> myClass2=new MyClass1<>();
System.out.println (myClass.getClass ()==myClass2.getClass () ); //对于两个参数同样使用
Class cls=myClass.getClass ();
Field[] fields =cls.getDeclaredFields ();
for(Field field:fields){
System.out.println (field.getType () );
}
}
}
运行结果:
在泛型类被泛型擦除的时候,之前泛型类中的类型参数部分如果没有指定上限,则会被转乘Object类,如果指定了上限就会被替换为类型上限如下:
class MyClass<T extends Integer,E extends String>{
private T age;
private E name;
public T getAge() {
return age;
}
public void setAge(T age) {
this.age = age;
}
public void testMethod2(T t){
System.out.println (t );
}
public E getName() {
return name;
}
public void setName(E name) {
this.name = name;
}
public void testMethod3(E e){
System.out.println (e );
}
public static void main(String[] args) {
MyClass<Integer,String> myClass=new MyClass <> ();
Class cls=myClass.getClass ();
Field[] fields =cls.getDeclaredFields ();
for(Field field:fields){
System.out.println (field.getType () );
}
}
}
运行结果如下: