首页 > 代码库 > Java泛型擦除

Java泛型擦除

Java泛型擦除

什么是泛型擦除?

       首先了解一下什么是泛型?我个人的理解:因为集合中能够存储随意类型的对象。可是集合中最先存储的对象类型一旦确定后,就不能在存储其它类型的对象了,否则,编译时不会报错。但执行时会抛出ClassCastException异常。为解决此问题,引入泛型,指定该集合对象中存储的对象类型,这样一旦该集合中存储了其它的对象类型,编译时会提示错误!(理解不当之处。希望大神多指点技术分享)。

        泛型的擦除就是说。在编译的时候集合中指定了确定的对象类型,但在执行时将集合中能够存储的该对象类型擦除了!

举例来说的话就是:

[html] view plaincopy技术分享技术分享
  1. import java.awt.List;  
  2. import java.util.ArrayList;  
  3. public class GenericDemo {  
  4.   
  5.     public static void main(String[] args) {  
  6.         ArrayList<String> a = new ArrayList<String>();  
  7.         // 集合a中仅仅能存储String类型的对象  
  8.         a.add("abc");  
  9.         a.add(6);   // 报错.执行时凝视掉  
  10.           
  11.         ArrayList<Integer> b = new ArrayList<Integer>();  
  12.         // 集合b中仅仅能存储Integer类型的对象  
  13.         b.add(6);  
  14.         b.add("abc");   // 报错.执行时凝视掉  
  15.           
  16.         System.out.println(a.getClass() == b.getClass());  
  17.         // 输出结果为    true  
  18.         /*  
  19.          *  原因:泛型执行时具有擦除功能;ArrayList<String>和ArrayList<Integer>擦除  
  20.          *  后的类型为ArrayList  
  21.          */  
  22.     }  
  23. }  
每一个类都有一个class属性,该样例同一时候说明使用泛型不会改变class属性的返回值。

注意点:Java不能创建泛型数组:由于Java中的数组都是通过反射动态建立的,在执行时,泛型会擦除类型信息,所以没有了类型信息。当然也就不能构造出数组了。

以上言语措辞或对问题的认识上有什么不当的,希望路过大神不吝赐教!

Java泛型擦除