泛型
泛型: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
黑马程序员博客-------泛型(1),布布扣,bubuko.com
原文:http://www.cnblogs.com/CharType/p/3585560.html