簡體   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