打字猴:1.700446994e+09
1700446994 避免JVM的大换血。C++的泛型生命期延续到了运行期,而Java是在编译器擦除掉的,我们想想,如果JVM也把泛型类型延续到运行期,那么JVM就需要进行大量的重构工作了。
1700446995
1700446996 版本兼容。在编译期擦除可以更好地支持原生类型(Raw Type),在Java 1.5或1.6平台上,即使声明一个List这样的原生类型也是可以正常编译通过的,只是会产生警告信息而已。
1700446997
1700446998 明白了Java的泛型是类型擦除的,我们就可以解释类似如下的问题了:
1700446999
1700447000 (1)泛型的class对象是相同的
1700447001
1700447002 每个类都有一个class属性,泛型化不会改变class属性的返回值,例如:
1700447003
1700447004 public static void main(String[]args){
1700447005
1700447006 List<String>ls=new ArrayList<String>();
1700447007
1700447008 List<Integer>li=new ArrayList<Integer>();
1700447009
1700447010 System.out.println(li.getClass()==li.getClass());
1700447011
1700447012 }
1700447013
1700447014 以上代码将返回为true,原因很简单,List<String>和List<Integer>擦除后的类型都是List,没有任何区别。
1700447015
1700447016 (2)泛型数组初始化时不能声明泛型类型
1700447017
1700447018 如下代码编译时通不过:
1700447019
1700447020 List<String>[]listArray=new List<String>[];
1700447021
1700447022 原因很简单,可以声明一个带有泛型参数的数组,但是不能初始化该数组,因为执行了类型擦除操作,List<Object>[]与List<String>[]就是同一回事了,编译器拒绝如此声明。
1700447023
1700447024 (3)instanceof不允许存在泛型参数
1700447025
1700447026 以下代码不能通过编译,原因一样,泛型类型被擦除了:
1700447027
1700447028 List<String>list=new ArrayList<String>();
1700447029
1700447030 System.out.println(list instanceof List<String>);
1700447031
1700447032
1700447033
1700447034
1700447035 编写高质量代码:改善Java程序的151个建议 [:1700438167]
1700447036 编写高质量代码:改善Java程序的151个建议 建议94:不能初始化泛型参数和数组
1700447037
1700447038 泛型类型在编译期被擦除,我们在类初始化时将无法获得泛型的具体参数,比如这样的代码:
1700447039
1700447040 class Foo<T>{
1700447041
1700447042 private T t=new T();
1700447043
[ 上一页 ]  [ :1.700446994e+09 ]  [ 下一页 ]