为什么说Java是伪泛型?

因为Java的泛型只在编译期起作用,就是在我们写代码时,起到一个检查的作用,当代码跑起来时,其内部并没有泛型。下面一个简单的例子就可以证明这一点。

通过反射,我们可以不受约束地将一个任意类型的元素添加到一个有泛型的集合中,如下:

// 这个方法可以给传进来的泛型集合添加任意类型的元素
  public <T> void add(List<T> al,Object obj) throws Exception {
       Class cls= al.getClass();
       Method m=cls.getMethod("add",Object.class);
       m.setAccessible(true);
       m.invoke(al,obj);
    }
// 下面调用上述方法来给一个泛型集合添加任意类型元素
   public void test1() throws Exception {
        ReflectDemo rd=new ReflectDemo();
        ArrayList<String> a=new ArrayList();
        //正常情况下,是不能给一个<String>泛型的集合加入非String型元素的
        rd.add(a,true);//add()方法就是上面写的方法
        rd.add(a,23);
        rd.add(a,new Car());//Car是自己写的一个类
        System.out.println(a);
    }
// 打印结果
[true, 23, Car(id=null, brand=null, color=null)]

通过这个例子可以看到,Java在运行时泛型并不起作用,通过反射拿到ArrayList的add方法,是没有泛型的,其参数类型为Object。所以可以添加别的类型的元素。

另一个更简单的例子也可以说明:

  public void test1plus(){
        ArrayList<String> a=new ArrayList<String>();
        ArrayList b=new ArrayList();
        System.out.println(a.getClass()==b.getClass());
    }

运行后打印结果为true,可见虽然集合加了泛型,但其字节码与没加泛型的是同一个,所以泛型只存在于编译期。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值