黑马程序员-泛型的擦出

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

jdk1.5的最大变化之一是泛型的加入,他对数据类型安全有重要意义。他提供给javac编译器使用,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入。

不过指定的泛型类型会在java源程序完成编译之后被抹去,而使得被Integer类和被String类指定的集合的字节码相同。以下面代码为例。

import java.lang.reflect.Method;
import java.util.ArrayList;


public class GenericsTest {
    public static void main(String[] args) throws Exception{
        //定义被String类指定的ArrayList
        ArrayList<String> al1=new ArrayList<String>();
        //向ArrayList添加String类型的元素
        al1.add("zhong");
        al1.add("guo");    
        //all.add(1);     //向ArrayList添加Integer类的数据提示错误
        //根据key打印出第一个元素
        System.out.println(al1.get(0));
        //int i=(Integer)al.get(0);//用int接收返回值提示错误
        //创建Integer泛型类的ArrayList
        ArrayList<Integer> al2=new ArrayList<Integer>();
        //输出Integer和String泛型类的ArrayList的字节码是否相等
        System.out.println(al1.getClass()==al2.getClass());
    }
}
通过al1.getClass()==al2.getClass()的结果得知Integer和String泛型类的ArrayList的字节码确实相等,说明java源程序完成编译后擦出的泛型类型。

进一步思考,当ArrayList身上的String泛型被擦出的话是否可以添加其他类型的元素,例如Integer类?一下是通过代码验证这一问题。

import java.lang.reflect.Method;
import java.util.ArrayList;


public class GenericsTest {
    public static void main(String[] args) throws Exception{
        //定义被String类指定的ArrayList
        ArrayList<String> al1=new ArrayList<String>();
        //向ArrayList添加String类型的元素
        al1.add("zhong");
        al1.add("guo");    
        //all.add(1);     //向ArrayList添加Integer类的数据提示错误
        //根据key打印出第一个元素
        System.out.println(al1.get(0));
        //int i=(Integer)al.get(0);//用int接收返回值提示错误
        //创建Integer泛型类的ArrayList
        ArrayList<Integer> al2=new ArrayList<Integer>();
        //输出Integer和String泛型类的ArrayList的字节码是否相等
        System.out.println(al1.getClass()==al2.getClass());
        //通过反射得到ArrayList的add方法,添加参数类型指定为Object
        Method me=ArrayList.class.getMethod("add", Object.class);
        //反射调用add方法,执行al1.add(5)
        me.invoke(al1, 5);
        //输出添加数字5之后的al1
        System.out.println(al1);
    }
}
运行结果类: zhong
            true
            [zhong, guo, 5]
从运行结果上看确实向String泛型的ArrayList中添加了整型数据5,所以我们可以确定泛型会在源程序编译后被擦输掉。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值