簡體   English   中英

Java - 為什么是Enum <E> 不允許作為注釋成員?

[英]Java - Why is Enum<E> not allowed as Annotation member?

它說:

原始

一個枚舉

另一個注釋

上面任何一個的數組

只有這些類型作為注釋成員是合法的,為什么通用的Enum不能成為注釋的成員?

例如 :

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface Param {

    Enum value();

}

這是不允許的。 但是Enum是一個常數不是嗎? 當您使用@Param(XXX) ,填寫Enum ,將決定@Param(XXX) (這意味着它是常量)。 為什么只允許成為特定枚舉?

我想要做的是制作一個接收任何枚舉的注釋:

// for example
@Param(value = AEnum.ABC)
@Param(value = BEnum.TTT)
@Param(value = CEnum.OOO)

我希望以上所有都是合法的。

雖然每個enum類型都繼承自java.lang.Enum ,但Enum類型本身不是enum類型。 類似地,雖然每個注釋類型都繼承自java.lang.annotation.Annotation ,但Annotation類型本身不是注釋類型。

沒有技術原因,在類文件中,每個實際值都將包含對其類型的引用。 因此,將注釋屬性聲明為Object並動態發現實際值的類型是技術上可行的,但正式規范不允許這樣做。

順便說一句,枚舉常量也不是編譯時常量。 所以雖然你可以聲明一個編譯時常量,如final String FOO = "some string"; 並在@Name(value=FOO)這樣的注釋中引用它,你不能對enum常量做同樣的事情。 您只能引用enum類型本身聲明的常量,如EnumType.NAME 這也是它在規范中如何正式定義的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM