Являются ли аннотации унаследованными от интерфейсов или суперкласса? [Дубликат]

Вы хотите отсортировать его в Javascript, не так ли? Вы хотите использовать функцию sort() . В этом случае вам нужно написать функцию компаратора и передать ее в sort(), что-то вроде этого:

function comparator(a, b) {
    return parseInt(a["price"], 10) - parseInt(b["price"], 10);
}

var json = { "homes": [ /* your previous data */ ] };
console.log(json["homes"].sort(comparator));

. Ваш компаратор принимает одну из каждого из вложенных хэшей внутри массива и решает, какой из них выше, проверяя поле «цена».

95
задан Boris Pavlović 20 April 2011 в 07:43
поделиться

1 ответ

Из Javadoc для @Inherited:

Указывает, что тип аннотации автоматически унаследован. Если в объявлении типа аннотации присутствует унаследованная мета-аннотация, и пользователь запрашивает тип аннотации в объявлении класса, а объявление класса не имеет аннотации для этого типа, тогда суперкласс класса будет автоматически запрашиваться для типа аннотации. Этот процесс будет повторяться до тех пор, пока не будет найдена аннотация для этого типа или не будет достигнута вершина иерархии классов (объект). Если у суперкласса нет аннотации для этого типа, тогда запрос будет указывать, что этот класс не имеет такой аннотации. Обратите внимание, что этот тип мета-аннотации не действует, если аннотированный тип используется для аннотации чего-либо, кроме класса. Обратите внимание также, что эта мета-аннотация позволяет только унаследовать аннотации от суперклассов; аннотации на реализованных интерфейсах не влияют.

С другой стороны, валидаторы JSR 305 выполняют своего рода поиск наследования. Если у вас есть иерархия классов:

//Person.java
@Nonnull
 public Integer getAge() {...}

//Student.java (inherits from Person)
@Min(5)
public Integer getAge() {...}

Тогда эффективными валидациями на Student.getAge() являются @Nonnull @Min(5). @Nonnull не имеет мета-аннотации @Inherited.

32
ответ дан thSoft 20 August 2018 в 20:14
поделиться
  • 1
    аннотации на интерфейсах полезны только в том случае, если у вас есть фреймворк, который их поддерживает. BTW в этом примере getAnnotation () возвращает null;) – Peter Lawrey 20 January 2011 в 11:41
  • 2
    Я не знаю, люди. В этом случае (если опечатки не было), я ожидаю ошибку компилятора The field value is ambiguous., как и с двумя интерфейсами, объявляющими одну и ту же константу с разными значениями. Я знаю, что это поле not , но значения аннотации все решают во время компиляции, не так ли? Функция, которую мы здесь пропустили, во многих случаях была бы очень полезной. К сожалению, о возрождении старого поста, кстати :). – Petr Janeček 20 April 2012 в 10:25
  • 3
    @Slanec взгляните на то, как источники Spring узнают, как парни Spring работали над этими проблемами. См. AnnotationUtils.findAnnotation (метод, annotationType) – Sean Patrick Floyd 20 April 2012 в 11:00
  • 4
    Я подумывал о написании чего-то подобного. Что-то вроде простого кеширования, это похоже на способ пойти за мной. Благодаря! В приведенном выше примере он найдет аннотацию Foo '(MyClass не имеет ее, тогда Интерфейсы будут искать и принимать в том порядке, в котором они находятся после implements), и поэтому печатают «baz». , Круто. – Petr Janeček 20 April 2012 в 11:20
  • 5
    @WChargin true, ему просто потребовалось 2 года, чтобы кто-то заметил эту опечатку :-) – Sean Patrick Floyd 9 June 2013 в 14:50
  • 6
    Это должен быть выбранный ответ – Ondreju 17 May 2016 в 15:43
  • 7
    ваш пример противоречит вашему ответу, в котором говорится, что @Inherited не влияет ни на что иное, кроме класса – Oleg Mikheev 21 January 2017 в 06:34
Другие вопросы по тегам:

Похожие вопросы: