泛型使用
泛型就是定义一种模板,,
例子:
ArrayList<String> strlist=new Arrarylist<String>();
这个strlist数组就只能装String类型的值了。
使用泛型时,把泛型参数替换为需要的class类型,如:ArrayList,ArrayList等。
可以省略编译器能自动推断出的类型,例如:List list = new ArrayList<>();;
泛型的实现方式:擦拭法
擦拭法是指,虚拟机对泛型其实一无所知,所有的工作都是编译器做的。
例如,我们编写了一个泛型类Pair<T>,这是编译器看到的代码:
public class Pair<T> {
private T first;
private T last;
public Pair(T first, T last) {
this.first = first;
this.last = last;
}
public T getFirst() {
return first;
}
public T getLast() {
return last;
}
}
而虚拟机根本不知道泛型。这是虚拟机执行的代码:
public class Pair {
private Object first;
private Object last;
public Pair(Object first, Object last) {
this.first = first;
this.last = last;
}
public Object getFirst() {
return first;
}
public Object getLast() {
return last;
}
}
因此,Java使用擦拭法实现泛型,导致了:
**编译器把类型<T>视为Object;
编译器根据<T>实现安全的强制转型**。
Java的泛型是由编译器在编译时实行的,编译器内部永远把所有类型T视为Object处理,但是,在需要转型的时候,编译器会根据T的类型自动为我们实行安全地强制转型。
泛型的局限
1,不能是基本数据类型,例如int,因为实际类型是Object,object无法持有基本类型。
错误例子
Pair<int> p=new Pair<>(1,2);