自定义泛型类

105 阅读2分钟

基本语法

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) {

}