web-dev-qa-db-fra.com

Comment utiliser l'annotation @inherited en Java?

Je ne reçois pas l'annotation @Inherited En Java. S'il hérite automatiquement des méthodes pour vous, alors si j'ai besoin de mettre en œuvre la méthode à ma façon, alors qu'en est-il?

Comment saura-t-on connaître mon mode de mise en œuvre?

De plus, il est dit que si je ne veux pas l'utiliser et que je le fais plutôt à l'ancienne Java façon, je dois implémenter la equals(), toString() et les méthodes hashCode() de la classe Object ainsi que la méthode de type d'annotation de la classe Java.lang.annotation.Annotation.

Pourquoi donc?

Je n'ai jamais implémenté ceux-là même quand je ne connaissais pas l'annotation @Inherited Et les programmes fonctionnaient bien également.

S'il vous plaît, quelqu'un m'explique à partir de zéro à ce sujet.

45
StrugglingCoder

Juste qu'il n'y a pas de malentendu: vous posez des questions sur Java.lang.annotation.Inherited . Il s'agit d'une annotation pour les annotations. Cela signifie que les sous-classes de classes annotées sont considérées comme ayant la même annotation que leur super-classe.

Exemple

Considérez les 2 annotations suivantes:

@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface InheritedAnnotationType {

}

et

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface UninheritedAnnotationType {

}

Si trois classes sont annotées comme ceci:

@UninheritedAnnotationType
class A {

}

@InheritedAnnotationType
class B extends A {

}

class C extends B {

}

exécuter ce code

System.out.println(new A().getClass().getAnnotation(InheritedAnnotationType.class));
System.out.println(new B().getClass().getAnnotation(InheritedAnnotationType.class));
System.out.println(new C().getClass().getAnnotation(InheritedAnnotationType.class));
System.out.println("_________________________________");
System.out.println(new A().getClass().getAnnotation(UninheritedAnnotationType.class));
System.out.println(new B().getClass().getAnnotation(UninheritedAnnotationType.class));
System.out.println(new C().getClass().getAnnotation(UninheritedAnnotationType.class));

affichera un résultat similaire à celui-ci (en fonction des packages de l'annotation):

null
@InheritedAnnotationType()
@InheritedAnnotationType()
_________________________________
@UninheritedAnnotationType()
null
null

Comme vous pouvez le voir, UninheritedAnnotationType n'est pas hérité mais C hérite de l'annotation InheritedAnnotationType de B.

Je ne sais pas quelles méthodes ont à voir avec ça.

91
fabian