繁体   English   中英

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

[英]How do you ensure a class annotation parameter extends an interface at compile time?

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

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

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

我假设这是因为NoStyle.class返回Class而不是Class<NoStyle> 在Java SE 5和7的JLS(找不到6,我使用的是6)中,它明确表示“ void.class”将返回“ Class”。 SEE JLS类文字: http//docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.8.2

无论如何在编译时执行此操作? 如果不是的话,我猜想解决方法是在运行时检查style的值,以确保它扩展了ITagStyle:'(

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

这行得通,因此您可能遗漏了明显的内容,或者您​​的错误与您向我们展示的内容无关:

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上进行了测试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM