泛型.类型擦除

泛型信息只存在于代码编译阶段,在进入JVM之前,与范型相关的信息会被擦出掉,专业术语叫做类型擦除:

一个参数的类型擦除:

class Person {
    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  person1 =new Person <> ();
       Person  person2 =new Person <> ();
        System.out.println (person1.getClass ()==person2.getClass () );  
}

运行结果 

打印结果为true,因为My Class和My Class在JVM中的Class都是MyClass.class.都属于T类下的。

两个参数的类型擦除

class MyClass1{
    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 myClass=new MyClass1 <> ();
        MyClass1 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{
    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 myClass=new MyClass <> ();
        Class cls=myClass.getClass ();
        Field[] fields =cls.getDeclaredFields ();
        for(Field field:fields){
            System.out.println (field.getType () );
        }

    }
}
运行结果如下:

泛型.类型擦除_第1张图片

 

 

你可能感兴趣的:(JAVA程序)