Maison > Java > javaDidacticiel > Une variable de type peut-elle faire référence à son propre sous-type en Java ?

Une variable de type peut-elle faire référence à son propre sous-type en Java ?

Mary-Kate Olsen
Libérer: 2024-12-19 01:30:11
original
364 Les gens l'ont consulté

Can a Type Variable Refer to Its Own Subtype in Java?

Une variable de type peut-elle faire référence au type actuel ?

Dans les langages de programmation, les variables de type sont essentielles pour exprimer les contraintes de type et le polymorphisme. Cependant, il existe des limites à la manière dont ces variables peuvent être utilisées. Une question courante est de savoir si une variable de type peut faire référence au sous-type exact dans lequel elle réside.

Considérez le code suivant :

class A {
    <T extends A> foo();
}

class B extends A {
    @Override
    T foo();
}
Copier après la connexion

Ici, nous définissons une classe A avec une méthode générique foo() qui prend un paramètre de type T. Nous définissons également une sous-classe B qui remplace la méthode foo(). La question est : le paramètre de type T dans foo() peut-il être utilisé pour faire référence au sous-type exact B dans la classe B ?

Réponse :

Malheureusement, Java le fait ne permet pas aux variables de type de faire référence au sous-type exact dans lequel elles résident. La variable de type T dans l'exemple ci-dessus reste un type inconnu dans la portée de foo() et ne peut pas être résolue en sous-type B.

Modèle de modèle curieusement récurrent (type auto) :

Pour obtenir le comportement souhaité consistant à avoir un type « soi », on peut utiliser un modèle de conception connu sous le nom de le modèle Curiously Recurring Template (CRT), également appelé « self-type ». Ce modèle implique la définition de classes de base abstraites qui appliquent un contrat pour renvoyer le type d'exécution d'une instance. Les classes dérivées implémentent le type self en résolvant le paramètre type en leur propre type.

Voici un exemple du modèle CRT en Java :

abstract class SelfTyped<SELF extends SelfTyped<SELF>> {
    abstract SELF self();
}

public class MyLeafClass extends SelfTyped<MyLeafClass> {
    @Override
    MyLeafClass self() {
        return this;
    }
}

MyLeafClass mlc = new MyLeafClass();
mlc.self(); // returns mlc
Copier après la connexion

Bien que ce modèle fournisse un moyen de faire référence à le type actuel utilisant self(), il doit être utilisé avec prudence car il introduit un potentiel d'utilisation abusive et peut compromettre la sécurité du type.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal