我试图弄清楚如何引用参数化界面作为注释属性:
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 :(得分:3)
问题是类文字引用了原始类类型。那是BaseServiceImpl.class
类型Class<BaseServiceImpl>
,而不是Class<BaseServiceImpl<? extends Number>>
。将值的返回类型更改为Class<? extends MyService>
,它应该编译。
答案 1 :(得分:0)
我认为带注释的界面应限制如下:
public @interface ServiceType { Class<? extends MyService<? extends Number>> value(); }