Java中的泛型

文章目录

    • 什么是泛型
    • 泛型方法
    • 泛型类
    • 类型通配符
    • 泛型原理-类型擦除

什么是泛型

泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的参数类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(如TE)。

泛型方法

泛型方法能够在调用时接收不同的参数类型,根据传递给泛型方法的参数类型,合适的进行方法调用。

举个例子,淘宝SDK调用时,请求的处理过程封装如下

public interface TaobaoClient {
    <T extends TaobaoResponse> T execute(TaobaoRequest<T> var1) throws ApiException;

    <T extends TaobaoResponse> T execute(TaobaoRequest<T> var1, String var2) throws ApiException;
}

此时T代表了一个继承自TaobaoResponse的子类,也就是SDK中指定的Reponse类,限定了开发者使用SDK中的类

泛型类

泛型类的声明和泛型方法类似,类名后需接上泛型参数,代表不同的参数类型。如图所示

public class Test<T> {
    private T t;
    public void add(T t) {
        this.t = t;
    }
    public T get() {
        return t;
    }
    public static void main(String[] args) {
        //todo: 限定了类型为Integer
        Test<Integer> test = new Test<>();
        test.add(1);
    }
}

上面限定了test实例变量接收的类型为Integer,如果开发者add方法中写入String类型,会报错,提供了类型安全的检测机制
Java中的泛型_第1张图片

类型通配符

  1. 无界通配符: ?, List 相当于传入的实参只要是个Object对象即可
  2. 上界通配符: ? extends T 表示传入的实参必须为T类型的子类
  3. 下界通配符: ? super T 表示传入的实参必须为T类型的父类

泛型原理-类型擦除

Java中的泛型都是在编译器层面的实现,在生成的字节码中是不包含泛型中的类型参数的。 使用泛型时指定的类型参数,会被编译器在编译的时候去掉,这个过程就是类型擦除。

ListList等类型,在编译之后都会变成 List。JVM 看到的只是 List,而由泛型附加的类型信息对 JVM 来说是不可见的。类型擦除的基本过程也比较简单,首先是找到用来替换类型参数的具体类。具体规则可以参考上文的类型通配符说明。

这个具体类一般是 Object。如果指定了类型参数的上界的话,则使用这个上界。把代码中的类型参数都替换
成具体的类。

你可能感兴趣的:(Java)