如何确保类注释参数在编译时扩展接口?

时间:2012-03-30 09:46:40

标签: java annotations

我有一个注释,我试图定义一个Class参数。我想确保提供的类扩展了特定的接口。所以我提出了......

public @interface Tag {
    Class<? extends ITagStyle> style() default NoStyle.class
}
public class NoStyle implements ITagStyle {
    ...
}

但是我遇到了“不兼容类型”的编译错误。

我假设这是因为NoStyle.class正在返回Class而不是Class<NoStyle>。在JLS for Java SE 5&amp; 7(找不到6,我正在使用6)它明确地说“void.class”将返回“Class”。查看JLS类文字:http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.8.2

有没有在编译时这样做?如果不是,我猜测workround是在运行时检查样式的值,以确保它扩展ITagStyle:'(

解决方案: JDeveloper在其“进程中”编译器中存在错误。检查“进程外”或使用JDK7u3可以纠正编译错误。

1 个答案:

答案 0 :(得分:0)

这是有效的,所以要么你缺少明显的东西,要么你的错误与你向我们展示的内容无关:

public class Test {

    public interface ITagStyle {
    }

    public @interface Tag {
        Class<? extends ITagStyle> style() default NoStyle.class;
    }

    public class NoStyle implements ITagStyle {
    }

    public class SomeStyle implements ITagStyle {

    }

    @Tag(style = SomeStyle.class)
    public static void main(String[] args) {

    }
}

已在JDK 1.6.0_26

上测试过