黑马程序员博客-------泛型(1)

泛型

泛型:jdk1.5出现的安全机制。

  使用泛型前:

 

 1      public static void main(String[] args) {
 2 
 3        ArrayList al=new ArrayList();
 4 
 5        al.add("abc");
 6 
 7        al.add("abckk");
 8 
 9        al.add(5);//添加一个5
10 
11        Iterator it=al.iterator();
12 
13        while(it.hasNext())
14 
15        {
16 
17        String str=(String)it.next();//强转为String类型,当第三个元素转换到这里的时候会报运行时异常
18 
19        //java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
20 
21        System.out.println(str);
22 
23        }
24 
25     }

 

使用泛型后:

 

 1    public static void main(String[] args) {
 2 
 3        ArrayList<String> al=new ArrayList<String>();
 4 
 5        al.add("abc");
 6 
 7        al.add("abckk");
 8 
 9        al.add(5);//添加一个5,原本的运行时异常会转为编译时异常,更加安全
10 
11        Iterator<String> it=al.iterator();
12 
13        while(it.hasNext())
14 
15        {
16 
17        String str=it.next();//这里不用进行强制转换了
18 
19        
20 
21        System.out.println(str);
22 
23        }
24 
25     }

 

好处:1.将运行时期的问题ClasscastExecption转到了编译时期。

      2.避免了强制转换的麻烦。

<>什么时候用:当操作的引用数据类型不确定的时候就使用<>,将要操作的引用数据类型传入即可,其实<>就是一个用于结束引用类型的参数范围,在程序中只要用到了带有<>的类或者接口,就要明确传入的具体引用数据类型。

泛型技术是编译时使用的技术,用于编译时期,确保了类型的安全。

运行时会将泛型去掉,生成的class文件是不带泛型的,这个称之为泛型的擦除

为了兼容运行时的类加载器,只能擦除;泛型的补偿:在运行时获取元素的类型进行转换动作,不用使用者在强制转换了。

Java中的泛型类型(或者泛型)类似于 C++ 中的模板。但是这种相似性仅限于表面,Java 语言中的泛型基本上完全是在编译器中实现,用于编译器执行类型检查和类型推断,然后生成普通的非泛型的字节码,这种实现技术称为擦除(erasure(编译器使用泛型类型信息保证类型安全,然后在生成字节码之前将其清除)。这是因为扩展虚拟机指令集来支持泛型被认为是无法接受的,这会为 Java 厂商升级其 JVM 造成难以逾越的障碍。所以,java的泛型采用了可以完全在编译器中实现的擦除方法。

因为泛型的擦除,所以利用反射技术可以绕过泛型的安全机制:

1 List<String> ls=new ArrayList<String>();//list只能存储String类型
2 
3 //得到class对象,再得到add方法,再调用。
4 
5          ls.getClass().getMethod("add",Object.class).invoke(ls, 5);
6 
7          System.out.println(ls);
8 
9  

 

转载于:https://www.cnblogs.com/CharType/p/3585560.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值