Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Могу ли я создать общий интерфейс для классов с определенной аннотацией?

Автор вопроса: mmjmandersОтветов: 3

Я хотел бы знать, есть ли способ создать общий интерфейс, который можно было бы реализовать со всеми классами, имеющими определенную аннотацию на уровне класса.
Например:

@XmlRootElement
public class Subscription { ... }
@XmlRootElement
public class Author { ... }

Я хотел бы создать общий интерфейс, применимый к этим двум классам (и многим другим). Есть ли способ добиться этого?

  • Что именно интерфейс должен требовать от классов для реализации? Аннотации? Какие-то методы? justkt 22.03.2011
  • Вы можете добавить интерфейс ко всем классам, которые имеют аннотацию, но вы ожидаете, что а) это будет сделано автоматически б) сделать что-то полезное? Peter Lawrey 22.03.2011

javainheritancegenericsjaxbannotations

Ответы

Ответ 1 · рейтинг 2 · biziclop

Интерфейсы и наследование используются для распространения функциональности "по вертикали", вниз по графу наследования.

Аннотации предназначены для дополнительных функций, которые можно прикрутить к классам, методам и т. д., и практически не связаны с интерфейсами.

Если вы заранее знаете, какими будут ваши классы и как они будут связаны друг с другом, вам, вероятно, вообще не нужны аннотации. Причина этого в том, что вы можете заставить их реализовывать интерфейсы маркеров (например, java.io.Serializable), которые практически аналогичны аннотациям уровня класса (без параметра), за исключением того, что с ними гораздо проще работать.

Ответ 2 · рейтинг 1 · Ralph

Это невозможно со стандартной Java, но вы можете использовать AspectJ Inter-Type. объявления типов.

Например, этот аспект добавит WhatEverInterface и реализацию к каждому классу, аннотированному @XmlRootElement.

public aspect MyAspect {
   declare parents: (@XmlRootElement) implements WhatEverInterface;

    public void WhatEverInterface.doSomething() {
       System.out.println("something");
    }
}

Ответ 3 · Suraj Chandran

Это так просто:

interface XmlProcessor
{
    public void process(XmlRootElement root);
}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы