2010-10-19 2 views
3

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

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> { /* ... */ } 

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

ответ

0

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

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

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

Смежные вопросы