>Java >java지도 시간 >Java 제네릭에 상한 및 하한 와일드카드를 사용하는 방법

Java 제네릭에 상한 및 하한 와일드카드를 사용하는 방법

王林
王林앞으로
2023-05-20 08:23:011556검색

상한

제네릭의 상한은 유형 매개변수가 특정 클래스의 하위 클래스이거나 특정 인터페이스를 구현해야 함을 지정합니다. 구문은 T 확장 B입니다. 여기서 T는 일반 유형 매개변수이고 B는 상한 유형입니다. 예를 들어, 다음 코드는 유형 매개변수 T가 Number 또는 해당 하위 클래스여야 하는 일반 클래스 Box를 보여줍니다. 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 参数是 Trrreee

위 코드에서 우리는 extends 키워드는 일반 유형 매개변수의 상한 유형을 지정하는 데 사용됩니다. 즉, 일반 유형 매개변수는 Number 또는 해당 하위 클래스여야 합니다. 이러한 방식으로 Box 클래스를 사용하여 Integer, Double, Float과 같은 유형의 값을 저장할 수 있습니다. code> 등은 모두 <code>Number의 하위 클래스이기 때문입니다. 또한 제네릭의 상한을 사용하면 Number 유형의 값만 Box 클래스의 인스턴스에 저장되어 유형의 위험을 피할 수 있습니다. 변환 예외. 🎜🎜제네릭을 사용할 때 유형이 상한 제한을 충족하지 않는 매개 변수를 전달하면 컴파일 중에 오류가 발생합니다. 예: 🎜rrreee🎜Lowerbound🎜🎜제네릭의 하한은 유형 매개 변수가 다음과 같아야 함을 지정합니다. 특정 클래스의 슈퍼 클래스 또는 인터페이스의 구현 클래스입니다. 구문은 T super B입니다. 여기서 T는 일반 유형 매개변수이고 B는 하한 유형입니다. 다음은 유형 매개변수 T가 Object 또는 해당 슈퍼클래스여야 하는 일반 클래스 Box를 보여주는 예입니다. 🎜rrreee🎜위 코드에서 우리는 super를 사용합니다. code> 키워드는 일반 유형 매개변수의 하한 유형을 지정하는 데 사용됩니다. 즉, 일반 유형 매개변수는 Object 또는 해당 슈퍼클래스여야 합니다. 이러한 방식으로 Box 클래스를 사용하여 Object, String, Integer, Double을 저장할 수 있습니다. code> 및 기타 유형의 값은 모두 Object의 하위 클래스이기 때문입니다. 또한 제네릭의 하한을 사용하면 Box 클래스의 인스턴스에 저장된 값이 모두 Object 유형인지 확인할 수 있어 다음과 같은 위험을 방지할 수 있습니다. 유형 변환 예외. 🎜🎜제네릭을 사용할 때 하한 제한을 준수하지 않는 유형의 매개변수를 전달하면 컴파일 중에 오류가 발생합니다. 예: 🎜rrreee🎜상한 및 하한 와일드카드🎜🎜때로는 제네릭을 사용해야 합니다. 동시에 상한 및 하한 제한을 사용하여 와일드카드 문자 ?를 사용하여 알 수 없는 유형을 나타낼 수 있습니다. 예를 들어, 다음 코드는 한 배열의 요소를 다른 배열로 복사하는 일반 메소드 copy를 보여줍니다. 🎜rrreee🎜위 코드에서는 와일드카드 문자 ?를 사용했습니다. > 알 수 없는 유형을 나타내려면 src 매개변수가 T 유형 또는 해당 하위 클래스이고 dest 매개변수가 인 것을 모두 만족할 수 있습니다. T 유형 또는 해당 상위 클래스에 대한 제약 조건입니다. 이런 식으로 모든 유형의 요소를 다른 목록에 복사할 수 있습니다. 상한 및 하한 와일드카드를 사용하면 유형 안전성을 보장하면서 일반 메소드를 보다 유연하게 정의할 수 있습니다. 🎜

위 내용은 Java 제네릭에 상한 및 하한 와일드카드를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제