Java泛型是SE 5带来的特性,它把类型检查提前到了编译期,这确实能减少不少运行时ClassCastException。但泛型的实现方式——类型擦除——让它和直觉有些出入。不搞懂背后这套机制,写出来的代码可能只是'没报错',而不是'真的安全'。
泛型类写起来简单,坑在擦除
定义泛型类就是加个尖括号:
class ClassName<T1, T2, ..., Tn> {
// 用T1、T2作为类型参数
}
需要继承时,也可以在extends里传递形参:
class ClassName<T1, T2, ..., Tn> extends ParentClass<T1> {
// 你可以只传一部分类型参数
}
顺手写个简单的 MyArray 体会一下:
class MyArray<T> {
public Object[] array = new Object[10];
public void set(int pos, T val) {
array[pos] = val;
}
public T get(int pos) {
return (T) array[pos];
}
public Object[] getArray() {
return array;
}
}
public class Test {
public static void main(String[] args) {
MyArray<String> myArray = new MyArray<>();
}
}
JDK 7以后,右边能用菱形操作符 <>,编译器会根据变量声明推断类型实参,少打几个字。
上界约束:你不能什么都往里装
有时泛型参数不能是任意类,比如你要比较大小,类型得能比。这时候用 extends 给类型参数划个上限:


