Java 泛型擦除

来源:互联网 发布:网络婚姻诈骗 编辑:程序博客网 时间:2024/06/10 08:58

         泛型擦除指:在编译器存在泛型类型,由代码指定的类作为该泛型的实际类型,当处于运行期时,该类型将不再存在,所以在运行期内的代码将无法获得泛型的具体类型信息,类型信息仅存在于Class实例中。

同一个泛型在运行时期,具体相同的运行时类,不管他们泛型对应的实际类型是什么,他们的运行时class是相同的。

如:

List<String> l1 = newArrayList<String>();
       List<Integer> l2 = newArrayList<Integer>();
       System.out.println(l1.getClass() ==l2.getClass());//true

上面的两个list通过getClass获取的类信息是相同的,所以是true.

泛型是通过java编译器的称为擦除(erasure)的前端处理来实现的。你可以(基本上就是)把它认为是一个从源码到源码的转换,它把泛型版本转换成非泛型版本。基本上,擦除去掉了所有的泛型类型信息。所有在尖括号之间的类型信息都被扔掉了,因此,比如说一个List<String>类型被转换为List。所有对类型变量的引用被替换成类型变量的上限(通常是Object)。而且,无论何时结果代码类型不正确,会插入一个到合适类型的转换。
       <T> T badCast(T t, Object o) {
         return (T) o; // unchecked warning
       }
类型参数在运行时并不存在。这意味着它们不会添加任何的时间或者空间上的负担,这很好。不幸的是,这也意味着你不能依靠他们进行类型转换。

0 0
原创粉丝点击