Невозможно создать аннотацию с несколькими связанными аргументами универсального класса

Я пытаюсь создать аннотацию, которая может принимать несколько классов в качестве входных данных. Типичное использование будет

@Prerequisites{FirstPrerequisite.class, SecondPrerequisite.class}

Для этого я могу создать аннотацию, как показано ниже

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Inherited
public @interface Prerequisites {
    public Class<?>[] value();
}

Я хочу ограничить типы, которые разрешены в аннотации предварительных условий. Если я дам что-то вроде public Class<? extends Dependency>[] value(); Однако это работает, проблема в том, что My FirstPrerequisite и SecondsPrerequisite могут быть расширены из того же типа. Я пробовал следующее, но ни один из них не работал, они дают ошибки компиляции.

public Class<? extends Dependency & TestCaseStep>[] value();
public Class<? extends Dependency , TestCaseStep>[] value();
public Class<T extends Dependency & TestCaseStep>[] value();

Как привязать Generics к входам двух разных типов?

1 ответ

Один из вариантов - создать интерфейс маркера и заставить ваши классы реализовать интерфейс. Затем вы можете указать границы этого типа интерфейса.

Другая альтернатива - просто переместить проверку ограничений во время выполнения, а не во время компиляции. Ваш процессор аннотаций должен проверить Class аргументы, которые были предоставлены.

Другие вопросы по тегам