从注释引用参数化类型

时间:2010-10-19 21:20:26

标签: java generics annotations

我试图弄清楚如何引用参数化界面作为注释属性:

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 个答案:

答案 0 :(得分:3)

问题是类文字引用了原始类类型。那是BaseServiceImpl.class类型Class<BaseServiceImpl>,而不是Class<BaseServiceImpl<? extends Number>>。将值的返回类型更改为Class<? extends MyService>,它应该编译。

答案 1 :(得分:0)

我认为带注释的界面应限制如下:

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