Maison  >  Article  >  Java  >  Comment utiliser les caractères génériques de limite supérieure et inférieure pour les génériques Java

Comment utiliser les caractères génériques de limite supérieure et inférieure pour les génériques Java

王林
王林avant
2023-05-20 08:23:011484parcourir

Bord supérieur

La limite supérieure des génériques spécifie que le paramètre type doit être une sous-classe d'une certaine classe ou implémenter une certaine interface. Sa syntaxe est T extends B, où T est un paramètre de type générique et B est un type de limite supérieure. Par exemple, le code suivant montre une classe générique Box, dont le paramètre de type T doit être Number ou sa sous-classe : 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

Dans le code ci-dessus, nous Le Le mot clé extends est utilisé pour spécifier le type de limite supérieure du paramètre de type générique, ce qui signifie que le paramètre de type générique doit être Number ou sa sous-classe. De cette façon, nous pouvons utiliser la classe Box pour stocker des valeurs de types tels que Integer, Double, Float code>, etc., car ce sont toutes des sous-classes de <code>Number. De plus, en utilisant la limite supérieure des génériques, nous pouvons garantir que seules les valeurs de type Number sont stockées dans les instances de la classe Box, évitant ainsi le risque de type exceptions de conversion. 🎜🎜Lors de l'utilisation de génériques, si nous passons un paramètre dont le type ne respecte pas la limite supérieure, une erreur se produira lors de la compilation, par exemple : 🎜rrreee🎜Bord inférieur🎜🎜La limite inférieure des génériques spécifie que le paramètre de type doit être un certain La superclasse d'une classe ou la classe d'implémentation d'une interface. Sa syntaxe est T super B, où T est le paramètre de type générique et B est le type de limite inférieure. Voici un exemple montrant une classe générique Box dont le paramètre de type T doit être Object ou sa superclasse : 🎜rrreee🎜Dans le code ci-dessus, nous Le super code> Le mot-clé est utilisé pour spécifier le type de limite inférieure du paramètre de type générique, ce qui signifie que le paramètre de type générique doit être <code>Object ou sa superclasse. De cette façon, nous pouvons utiliser la classe Box pour stocker Object, String, Integer, Double code> et d'autres types de valeurs, car ce sont toutes des sous-classes de Object. De plus, en utilisant la limite inférieure des génériques, nous pouvons garantir que les valeurs stockées dans les instances de la classe Box sont toutes de type Object, évitant ainsi le risque de exceptions de conversion de type. 🎜🎜Lors de l'utilisation de génériques, si nous passons un paramètre dont le type ne respecte pas la limite inférieure, une erreur se produira lors de la compilation, par exemple : 🎜rrreee🎜Caractères génériques de limite supérieure et inférieure🎜🎜Parfois, nous devons utiliser des génériques en même temps En utilisant des restrictions de limites supérieures et inférieures, le caractère générique ? peut être utilisé pour représenter des types inconnus. Par exemple, le code suivant montre une méthode générique copy qui copie les éléments d'un tableau vers un autre tableau : 🎜rrreee🎜Dans le code ci-dessus, nous avons utilisé le caractère générique ? pour représenter un type inconnu, il peut satisfaire à la fois le paramètre src est le type T ou sa sous-classe, et le paramètre dest est T Contraintes sur un type ou sa superclasse. De cette façon, nous pouvons copier des éléments de n’importe quel type dans une autre liste. En utilisant des caractères génériques de limites supérieure et inférieure, nous pouvons définir des méthodes génériques de manière plus flexible tout en garantissant la sécurité des types. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer