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

Java泛型擦除

Java泛型擦除

什么是泛型擦除?

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

        泛型的擦除就是说,在编译的时候集合中指定了确定的对象类型,但在运行时将集合中可以存储的该对象类型擦除了!举例来说的话就是:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  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中的数组都是通过反射动态建立的,在运行时,泛型会擦除类型信息,所以没有了类型信息,当然也就不能构造出数组了。

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