Maison >Java >javaDidacticiel >Comment puis-je faire référence au type actuel avec une variable de type en Java ?

Comment puis-je faire référence au type actuel avec une variable de type en Java ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-18 08:02:10421parcourir

How Can I Refer to the Current Type with a Type Variable in Java?

Existe-t-il un moyen de faire référence au type actuel avec une variable de type ?

En Java, il n'est pas possible de faire directement référence au type actuel avec un type variable. Le problème survient lorsque l'on tente d'écrire des méthodes capables de renvoyer une instance du type actuel, ce qui devient problématique lorsqu'il s'agit de sous-typage. Par exemple, déclarer une méthode générique avec le type de retour T dans une classe de base fera référence au type de classe de base dans les sous-classes, et non au type de sous-classe réel.

Une solution de contournement tirant parti des limites récursives et des classes/interfaces abstraites

Pour résoudre ce problème, une limite récursive et une hiérarchie de classes abstraites peuvent être utilisées comme suit :

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

class MyBaseClass<SELF extends MyBaseClass<SELF>>
        extends SelfTyped<SELF> {

    MyBaseClass() { }

    public SELF baseMethod() {
        return self();
    }
}

final class MyLeafClass extends MyBaseClass<MyLeafClass> {

    @Override
    MyLeafClass self() {
        return this;
    }

    public MyLeafClass leafMethod() {
        return self();
    }
}

Dans cette approche, les classes feuilles résolvent le paramètre de type récursif SELF à leur propre type et implémente self(). Les classes Leaf peuvent être utilisées directement, permettant le chaînage de méthodes tout en préservant le type de retour correct :

MyLeafClass mlc = new MyLeafClass().baseMethod().leafMethod();

AnotherLeafClass alc = new AnotherLeafClass().baseMethod().anotherLeafMethod();

Attention : Cette technique s'appuie sur le modèle de modèle curieusement récurrent (CRT) et introduit certains risques :

  • Vulnérabilité de substitution de type : Les classes dérivées peuvent remplacer SELF pour renvoyer un type différent, compromettant la garantie d'auto-type.
  • Implémentation incorrecte de self() : Les implémentations de classes dérivées de self() peuvent ne pas renvoyer avec précision l'instance actuelle.

À atténuez ces risques, assurez-vous que les classes impliquées ne sont pas extensibles publiquement et envisagez d'utiliser des constructeurs et des méthodes privés de package pour SelfTyped et self().

Évaluation et considérations d'utilisation

Bien que cette solution de contournement fournisse un moyen de référencer le type actuel, elle introduit une complexité et des limitations supplémentaires. Il est conseillé de peser soigneusement les avantages et les inconvénients potentiels avant de le mettre en œuvre. Dans les cas où le référencement de type explicite est crucial, cette solution peut être utile, mais évitez de vous y fier de manière excessive ou dans des API publiques.

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