泛型.类型擦除

泛型信息只存在于代码编译阶段,在进入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 () );
        }

    }
}
运行结果如下:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值