泛型

2020-06-07  本文已影响0人  卡路fly

[toc]

概念

把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型

参数化类型:

作用

强制类型转换

先看一个问题: List<String>能否转为List<Object>
回答:不能。
参数类型(泛型)本质上是一个占位符,在编译的时候会被具体的类型替换。因此,List<String>会将String替换占位符,如果转为List<Object>,则是将Object替换占位符,这导致编译器不允许这样强制类型转换。编译以后,该占位符会被移除,运行时你是无法得到任何集合类型中数据的类型信息的。换句话说,

List<String> strings = new LinkedList<String>( ); 
List<Integer> ints = new LinkedList<Integer>( );

上面的代码在运行时和

List strings = new LinkedList( ); 
List ints = new LinkedList( );

毫无二致。因此,可以用一下方式进行转换:

List ss=strings; 
List<Object> objects=ss;

Java泛型与C++泛型区别

Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉。这个过程就称为类型擦除

如在代码中定义的List<object>和List<String>等类型,在编译后都会变成List。JVM看到的只是List,而由泛型附加的类型信息对JVM来说是不可见的。Java编译器会在编译时尽可能的发现可能出错的地方,但是仍然无法避免在运行时刻出现类型转换异常的情况。类型擦除也是Java的泛型实现方法与C++模版机制实现方式之间的重要区别。

上一篇 下一篇

猜你喜欢

热点阅读