Подтвердить что ты не робот

Как использовать аннотацию @inherited в Java?

Я не получаю аннотацию @Inherited в Java. Если он автоматически наследует методы для вас, тогда, если мне нужно реализовать метод по-своему, то что с этим?

Как он узнает мой способ реализации?

Плюс сказано, что если я не хочу использовать это и делать это по-старому Java-способу, мне нужно реализовать методы equals(), toString() и hashCode() Object класс, а также метод типа аннотации класса java.lang.annotation.Annotation.

Почему это?

Я никогда не реализовал их, даже когда я не знал о аннотации @Inherited, и программы, которые также отлично работали.

Пожалуйста, объясните мне меня с нуля.

4b9b3361

Ответ 1

Просто, что нет недоразумений: вы спрашиваете о java.lang.annotation.Inherited. Это аннотация для аннотаций. Это означает, что подклассы аннотированных классов считаются с тем же аннотацией, что и их суперкласс.

Пример

Рассмотрим следующие 2 аннотации:

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

}

и

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

}

Если три класса аннотируются следующим образом:

@UninheritedAnnotationType
class A {

}

@InheritedAnnotationType
class B extends A {

}

class C extends B {

}

запуск этого кода

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

напечатает результат, подобный этому (в зависимости от пакетов аннотации):

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

Как вы видите, UninheritedAnnotationType не наследуется, но C наследует аннотацию InheritedAnnotationType от B.

Я не знаю, какие методы имеют отношение к этому.