基本语法
class 类名<E, T...> { // ...表示可以有多个泛型,例如<E, T, R>
成员
}
泛型标识符可以有多个
泛型类的类型是在创建对象时确定的,在创建对象时需要确定类型
如果创建对象时没有指定类型,则默认Object
/**
* E, T, R 是泛型的标识符,可以随意填写,比如:A, B, C;
* 一般是单个大写字母,多个也可以,比如:Ea, t, R;
*/
public class Generics<E, T, R> {
}
// 创建对象时确定泛型的类型
// E = Double, T = String, R = Integer
Generics<Double, String, Integer> generics = new Generics<>();
// 创建对象时不指定泛型的类型
Generics generics = new Generics();
// 等同于
Generics<Object, Object, Object> generics = new Generics<>();
普通成员可以使用泛型(属性,方法)
普通方法的返回类型,普通方法的参数,普通成员变量
public class Generics<E, T, R> {
private E e; // 普通成员
private T t;
private R r;
public E getE() { // 返回类型
return e;
}
public void setE(E e) { // 方法参数
this.e = e;
}
}
使用泛型的数组,不可以初始化
数组在new时,需要在内存开辟空间,不确定泛型的类型,就无法在内存中开辟空间
// 这样定义时编译器会提示错误:Type parameter 'E' cannot be instantiated directly
// 错误译文:无法直接实例化类型参数“E”
E[] es = new E[10];
静态方法/成员属性中不能使用类的泛型
静态是和类相关的,在类加载时会加载静态属性和方法,这时类对象还没有创建(泛型是在创建类对象时指定的),如果静态方法和静态属性使用了泛型则JVM无法完成初始化
// 这样定义时编译器会提示错误:cannot be referenced from a static context
// 错误译文:不能从静态上下文引用
public static E e1;
public static void show(T t1) {
}