介绍

Java中的泛型是一种强类型的机制,答应咱们在编译时查看类型的安全性,以防止在运行时出现类型转化反常。泛型的上界和下界用于约束泛型类型参数的规模,本文将会具体介绍它们的概念和用法。

上界

泛型的上界指定了类型参数有必要是某个类的子类或者完成了某个接口。它的语法方式为 T extends B,其中T是泛型类型参数,B是上界类型。例如,下面的代码展示了一个泛型类 Box,它的类型参数T有必要是 Number 或其子类:

public class Box<T extends Number> {
    private T value;
    public Box(T value) {
        this.value = value;
    }
    public T getValue() {
        return value;
    }
}

在上面的代码中,咱们运用了 extends 关键字来指定泛型类型参数的上界类型,这意味着泛型类型参数有必要是 Number 或其子类。这样,咱们就能够运用 Box 类来存储 IntegerDoubleFloat 等类型的值,由于它们都是 Number 的子类。别的,通过运用泛型的上界,咱们能够确保 Box 类的实例中只存储 Number 类型的值,防止了类型转化反常的危险。

在运用泛型的时分,假如咱们传入一个类型不符合上界约束的参数,则会在编译时产生过错,例如:

Box<String> box = new Box<>("Hello World");    // 编译过错:String 不是 Number 的子类

下界

泛型的下界指定了类型参数有必要是某个类的超类或者是某个接口的完成类。它的语法方式为 T super B,其中T是泛型类型参数,B是下界类型。下面是一个示例,展示了一个泛型类 Box,它的类型参数T有必要是 Object 或其超类:

public class Box<T super Object> {
    private T value;
    public Box(T value) {
        this.value = value;
    }
    public T getValue() {
        return value;
    }
}

在上面的代码中,咱们运用了 super 关键字来指定泛型类型参数的下界类型,这意味着泛型类型参数有必要是 Object 或其超类。这样,咱们就能够运用 Box 类来存储 ObjectStringIntegerDouble 等类型的值,由于它们都是 Object 的子类。别的,通过运用泛型的下界,咱们能够确保 Box 类的实例中存储的值都是 Object 类型,防止了类型转化反常的危险。

在运用泛型的时分,假如咱们传入一个类型不符合下界约束的参数,则会在编译时产生过错,例如:

Box<Integer> box = new Box<>(123);    // 编译过错:Integer 不是 Object 的超类

上下界通配符

有时分,咱们需要在泛型中一起运用上界和下界的约束,此时能够运用通配符 ? 来表明不知道类型。例如,下面的代码展示了一个泛型办法 copy,它能够将一个数组的元素复制到另一个数组中:

public static <T> void copy(List<? extends T> src, List<? super T> dest) {
    for (T t : src) {
        dest.add(t);
    }
}

在上面的代码中,咱们运用了通配符 ? 来表明不知道类型,它能够一起满足 src 参数是 T 类型或其子类,dest 参数是 T 类型或其超类的约束条件。这样,咱们就能够将任意类型的元素复制到另一个列表中了。通过运用上下界通配符,咱们能够愈加灵敏地界说泛型办法,一起确保类型安全。

总结

Java中的泛型是一种强类型的机制,它能够在编译时查看类型的安全性。泛型的上界和下界用于约束类型参数的规模,它们能够让咱们更精确地操控类型的运用。在运用泛型时,咱们需要根据实践需求挑选合适的上下界约束,以确保程序的正确性和可靠性

除了上下界约束外,还能够运用通配符 ? 来表明不知道类型,从而愈加灵敏地界说泛型类和办法。因而,学习和把握泛型机制对于Java开发人员来说是非常重要的。