我想弄清楚如何将参数化接口(interface)引用为注释属性:
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> { /* ... */ }
在尝试提供通用类型时,我缺少什么来消除不匹配错误?
最佳答案
问题是类字面量指的是原始类类型。即BaseServiceImpl.class
类型为 Class<BaseServiceImpl>
, 不是 Class<BaseServiceImpl<? extends Number>>
.将值的返回类型改为Class<? extends MyService>
它应该编译。
关于java - 从注解引用参数化类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3972862/