簡體   English   中英

java 循環注釋

[英]java cyclic annotations

我想用注釋創建樹結構

@Retention(RetentionPolicy.RUNTIME)
public @interface MyNode {
     String name();
     MyNode next() default null;
}

但編譯器告訴它是循環的,因此是不允許的。

我想知道為什么不允許這樣做,我怎樣才能做出類似的東西?

它不是樹形結構,只是線性列表。 嘗試使用數組來簡化聲明。

@Retention(RetentionPolicy.RUNTIME)
public @interface MyNode {
     String name();
}

並包裝:

@Retention(RetentionPolicy.RUNTIME)
public @interface MyNodes {
     MyNode[] value();
}

現在,只需聲明為數組:

@MyNodes({ 
    @MyNode(name = "name1"),
    @MyNode(name = "name2")
})
public class MyClass {
}
  1. 注釋是編譯時常量。
  2. 注釋成員只能是編譯時常量(字符串、原語、枚舉、注釋、class 文字)。
  3. 任何引用自己的東西都不能是常量,所以注解不能引用自己。

有趣的是:Java 語言規范的一部分似乎與此相矛盾:

注釋類型聲明上的注釋稱為元注釋。 一個注解類型可以用來注解它自己的聲明。 更一般地,“注釋”關系的傳遞閉包中的循環是允許的。 例如,用另一種注解類型來注解一個注解類型聲明,用前一種類型注解后一種類型的聲明是合法的。 (預定義的元注釋類型包含幾個這樣的循環。)
[ 來源]

但是我得到了一個編譯錯誤(注釋引用本身):

public @interface Funky {
    Funky funky();
}

和這個(兩個注釋相互引用):

public @interface Funky {
    Monkey monkey();
}
public @interface Monkey {
    Funky funky();
}

如果你真的需要這個,你可能想要使用 Sun Java 5 編譯器,這里沒有強制執行此限制。

但也許更好的解決方案是將節點存儲在一個數組中,並讓每個節點都有它的子節點的索引。

暫無
暫無

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

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