[toc]
概念
把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型
参数化类型:
- 把类型当作是参数一样传递
- <数据类型> 只能是引用类型
作用
- 代码更加简洁【不用强制转换】
- 程序更加健壮【只要编译时期没有警告,那么运行时期就不会出现ClassCastException异常】
- 可读性和稳定性【在编写集合的时候,就限定了类型】
强制类型转换
先看一个问题: 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++模版机制实现方式之间的重要区别。