Использование литерального значения класса по умолчанию для аннотации - PullRequest
6 голосов
/ 24 августа 2010

Я хочу аннотировать некоторые поля данного класса бинов следующей аннотацией:

@Target({FIELD})
@Retention(RUNTIME)
public @interface Process {

    Class<? extends ProcessingStrategy> using() default DefaultImplStrategy.class;

}

Не вдаваясь в домен слишком много, каждому аннотированному свойству нужно задать для него ProcessingStrategy, а следовательно, и свойство using () для аннотации. Это нормально и работает так, как мне бы хотелось.

Я также хочу указать реализацию стратегии по умолчанию, которая будет использоваться большую часть времени (по умолчанию, определенная ниже). Это отлично работает в Eclipse.

Однако, когда я пытаюсь скомпилировать это, используя обычный JDK (вызывается через maven), я получаю следующую ошибку:

found   : java.lang.Class<DefaultImplStrategy>
required: java.lang.Class<? extends ProcessingStrategy>

Я предполагаю, что здесь есть какая-то комбинация обобщений, аннотаций, литералов классов и значений по умолчанию, но я, честно говоря, не знаю почему. Я взглянул на правила, касающиеся значений по умолчанию в JLS, и, похоже, я ничего не нарушаю.

Учитывая, что DefaultImplStrategy определенно реализует ProcessingStrategy, что я здесь не так делаю?

Ответы [ 2 ]

3 голосов
/ 22 сентября 2010

Короткая версия этого заключается в том, что некоторые комбинации аннотаций maven, Lombok и default не сочетаются друг с другом.Более длинная версия - в списке рассылки Lombok .

Решение относительно простое: полностью определить тип по умолчанию, т.е.

@Target({FIELD})
@Retention(RUNTIME)
public @interface Process {

    Class<? extends ProcessingStrategy> using() default com.example.processing.DefaultImplStrategy.class;

}
0 голосов
/ 02 февраля 2011

Не знаю почему, но если вы дадите полный путь к классу DefaultImplStrategy, он, вероятно, будет работать

...