2012-03-30 20 views
0

我有一个注释,我试图去定义一个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 & 7(找不到6,我正在使用6)它特别说“void.class”会返回“Class”。 SEE JLS类文字:http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.8.2

有没有办法在编译时执行此操作?如果不是我猜workround在运行时检查的风格值,以确保它延伸ITagStyle:'(

解决方案: JDeveloper已经在他们的‘过程’的编译器错误检查“出来的过程。 “或者使用JDK7u3纠正编译错误

+0

适合我。什么是完整的错误信息? – 2012-03-30 09:50:24

+0

适用于我:) – adarshr 2012-03-30 09:55:57

+0

错误:不兼容的类型。也更具体一点,我使用jdk1.6.0_26 ...也许是一个错误? – xer21 2012-03-30 09:58:00

回答

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