什么泛型
把类型参数化,一套标准可以适用不同类型,而不用重复定义。
实现泛型的两种方式,用ArrayList< String>举例
- 在运行时真正生成ArrayList< String>这个类型,并与ArrayList类建立继承关系。
- 把ArrayList< String>还原成ArrayList类型,在元素访问,修改时进行强制类型转换。
Java的泛型并不是真正意义上的泛型。并不会真正存在ArrayList< String>这个类型。Java使用的是泛型擦除的方法来实现泛型的。
Java之所以要采用泛型擦除是因为要兼容更老的JDK版本的代码。
泛型擦除:即使定义了泛型也会转换成更上层的类型。只是在元素访问,修改时进行强制类型转换。
定义泛型:
public static void main(String[] args) throws Exception {
List<String> list = new ArrayList<>();
list.add("hello");
System.out.println(list.get(0));
}
实际的操作
public static void main(String[] args) throws Exception {
List<String> list = new ArrayList();
list.add("hello");
System.out.println((String)list.get(0));//强制类型转换。
}
注意基本类型不能作为泛型,因为基本类型之间强制转换未出现问题,例如大转小
List<int> list = new ArrayList<>();//这样的定义是错误的,编译都不会通过
Java泛型效率不高,因为要进行类型转换,虽然不用进行手动转换,那是因为Java支持自动装箱,拆箱。它帮我们把类型转换了,并不是没有转换。转换操作还是必须的。