2009-09-22 104 views
157

今天,我想創造我的下this documentation第一註釋界面和我得到的編譯器錯誤「的註釋成員的無效類型」:哪些類型可以用於Java註釋成員?

public @interface MyAnnotation { 
    Object myParameter; 
    ^^^^^^ 
} 

顯然Object不能用作類型的註釋成員。不幸的是,我找不到關於哪種類型可以用於一般的任何信息。

這我發現使用試驗和錯誤:

String --> Valid

int --> Valid

Integer --> Invalid (Surprisingly)

String[] --> Valid (Surprisingly)

Object --> Invalid

也許有人可以闡明哪些類型實際上是允許一些光,爲什麼。

+0

可能因註釋而異 - 請顯示您正在編寫的代碼。 – djna 2009-09-22 07:12:34

+2

已添加到問題中。但我不認爲它有所不同。 – 2009-09-22 07:20:05

回答

226

它由section 9.6.1 of the JLS指定。的註釋成員類型必須是以下之一:

  • 原始
  • 字符串
  • 枚舉
  • 另一個註釋
  • 任何上述

的陣列這看起來有些限制,但毫無疑問,這是有原因的。

還要注意的是多維數組(例如String[][])隱含地通過上述規則禁止的。

+17

如何找到這些頁面/文檔?我發誓我谷歌每次之前詢問StackOverlow和許多Java問題有人發佈了一個鏈接到JSL的回答我的問題。爲什麼我沒有通過Google找到這些網頁? – 2009-09-22 07:17:43

+8

JLS不是非常適合谷歌。你只需要知道它在那裏。 – skaffman 2009-09-22 07:21:14

+1

在sun網站上的註釋指南中也提供了相同的信息(確實發現了谷歌搜索):http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html – wds 2009-09-22 12:52:00

53

我同意Skaffman提供的類型。

其他限制:它必須是編譯時常量

例如,以下是被禁止的:

@MyAnnot("a" + myConstantStringMethod()) 
@MyAnnot(1 + myConstantIntMethod()) 
10

註解的概念符合真的很好用我的項目的設計,直到我意識到,你不能有註釋複雜數據類型。我通過使用我想要實例化的類而不是該類的實例化對象來解決這個問題。這並不完美,但Java很少。

@interface Decorated { Class<? extends PropertyDecorator> decorator() } 

interface PropertyDecorator { String decorate(String value) } 

class TitleCaseDecorator implements PropertyDecorator { 
    String decorate(String value) 
} 

class Person { 
    @Decorated(decorator = TitleCaseDecorator.class) 
    String name 
} 
15

另外不要忘記,註解本身可以是一個註釋定義的一部分。這允許一些簡單的註釋嵌套 - 在希望多次出現一個註釋的情況下方便。

例如:

@ComplexAnnotation({ 
    @SimpleAnnotation(a="...", b=3), 
    @SimpleAnnotation(a="...", b=3), 
    @SimpleAnnotation(a="...", b=3) 
}) 
public Object foo() {...} 

其中SimpleAnnotation

@Target(ElementType.METHOD) 
public @interface SimpleAnnotation { 
    public String a(); 
    public int b(); 
) 

ComplexAnnotation是取自

@Target(ElementType.METHOD) 
public @interface ComplexAnnotation { 
    public SimpleAnnotation[] value() default {}; 
) 

實例:https://blogs.oracle.com/toddfast/entry/creating_nested_complex_java_annotations

+3

使用Java 8'@Redable',這不再需要。 – Mordechai 2017-01-18 05:37:14

相關問題