概述
- 泛型类和泛型方法有类型参数,这使得他们可以准确描述用特定类型实例化时会发生什么。如果没有泛型,就将必须使用Object类编写使用于多种类型的代码,这既繁琐,右不安全。
泛型程序设计(generic programming)
意味着编写的代码可以对多种不同类型的对象复用。
类型参数的好处
- 可读性
- 编译器可以充分利用类型信息,在调用get时不用进行强制类型转换
- 编译器现在可以检查,防止插入错误类型的对象
泛型类
public class Pair<T,E> {
private T first;
private E second;
public Pair() {
first = null;
second = null;
}
public Pair(T first, E second) {
this.first = first;
this.second = second;
}
}
通过传入具体的类型变量来实例化该泛型类。
public static void main(String[] args) {
Pair<String,Integer> pair = new Pair<>("1",2);
System.out.println(pair.getFirst());
}
泛型方法
//注意:类型变量放在修饰符的后面,返回值类型的前面
public static <T> T getMiddle(T...a){
return a[a.length/2];
}
泛型接口
public interface IntercaceName<T>{
T getData();
}
//实现接口时,可以选择指定泛型类型,也可以选择不指定, 如下:
//指定类型:
public class Interface1 implements IntercaceName<String> {
private String text;
@Override
public String getData() {
return text;
}
}
//不指定类型:
public class Interface1<T> implements IntercaceName<T> {
private T data;
@Override
public T getData() {
return data;
}
}
泛型变量的限定
在使用泛型时, 可以指定泛型的限定区域
<T extends 类或接口1 & 接口2>//限定泛型必须是某某类的子类或 某某接口的实现类
//注意:类必须是限定列表的第一个限定
泛型代码和JVM
- 类型擦除(虚拟机中没有泛型,只有普通的类和相应的方法)
- 所有的类型参数都会替换成他们的限定类型
- 会合成桥方法来维持多态()
- 为保证类型安全性,必要时会进行强制类型转换
泛型通配符
Pair<? extends Parent>
Pair<? super Child>
- 带有超类型的限定的通配符允许你写入一个泛型对象
- 带有子类型的限定的通配符允许你读取一个泛型对象