Ссылка на параметризованный тип из аннотации - PullRequest
3 голосов
/ 20 октября 2010

Я пытаюсь выяснить, как ссылаться на параметризованный интерфейс как атрибут аннотации:

public class Example {
    public interface MyService<T extends Number> {
        T someNumber();
    }

    public class BaseServiceImpl<T extends Number> implements MyService<T> {
        @Override
        public T someNumber() {
            return null;
        }
    }

    public @interface ServiceType {
        Class<? extends MyService<?>> value();
    }

    @ServiceType(BaseServiceImpl.class)
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

Приведенный выше код завершается с ошибкой типа в аннотации @ServiceType. Я считаю, что проблема в границах, которые я указал для атрибута value. Я также заметил, что когда тип не является универсальным, он работает нормально; например @ServiceType(IntegerService.class) дано работ:

    public class IntegerService extends BaseServiceImpl<Integer> { /* ... */ }

Чего мне не хватает, чтобы избавиться от ошибки несоответствия при попытке указать универсальный тип?

Ответы [ 2 ]

3 голосов
/ 20 октября 2010

Проблема в том, что литералы класса ссылаются на необработанные типы классов.То есть BaseServiceImpl.class имеет тип Class<BaseServiceImpl>, а не Class<BaseServiceImpl<? extends Number>>.Измените тип возвращаемого значения на Class<? extends MyService>, и оно должно скомпилироваться.

0 голосов
/ 20 октября 2010

Я думаю, что аннотированный интерфейс должен быть ограничен следующим образом:

public @interface ServiceType {
        Class<? extends MyService<? extends Number>> value();
}
...