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
Mary-Kate Olsenoriginal
2024-12-19 01:30:11366parcourir

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();
}

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

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!

Déclaration:
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