4 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊
關(guān)于它沒有這樣設(shè)計(jì)的原因你可以在JSR 175設(shè)計(jì)常見問題中找到答案,它說:
為什么不支持注釋子類型(一個(gè)注釋類型擴(kuò)展另一個(gè))?
它使注釋類型系統(tǒng)復(fù)雜化,并且使編寫“特定工具”變得更加困難。
...
“特定工具” - 查詢?nèi)我馔獠砍绦虻囊阎⑨岊愋偷某绦?。例如,存根發(fā)生器就屬于這一類。這些程序?qū)⒆x取帶注釋的類而不將它們加載到虛擬機(jī)中,但會(huì)加載注釋接口。
所以,是的,我想,原因是它只是KISS。無論如何,似乎這個(gè)問題(以及許多其他問題)正在作為JSR 308的一部分進(jìn)行研究,你甚至可以找到一個(gè)已經(jīng)由Mathias Ricken開發(fā)的具有此功能的替代編譯器。

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超5個(gè)贊
可擴(kuò)展注釋將有效地增加指定和維護(hù)另一種類型系統(tǒng)的負(fù)擔(dān)。這將是一個(gè)相當(dāng)獨(dú)特的類型系統(tǒng),因此您不能簡單地應(yīng)用OO類型范例。
在將多態(tài)性和繼承引入注釋時(shí),請仔細(xì)考慮所有問題(例如,當(dāng)子注釋更改元注釋規(guī)范(例如保留)時(shí)會(huì)發(fā)生什么?)
所有這些增加了用例的復(fù)雜性?
您想知道給定的注釋是否屬于某個(gè)類別?
試試這個(gè):
@Target(ElementType.ANNOTATION_TYPE)public @interface Category { String category();}@Category(category="validator")public @interface MyFooBarValidator {}
如您所見,您可以使用提供的工具輕松地對注釋進(jìn)行分組和分類,而不會(huì)造成過度的痛苦。
因此,KISS是不向Java語言引入元類型系統(tǒng)的原因。
[ps編輯]
我只使用String作為演示,并考慮到開放式元注釋。對于您自己的給定項(xiàng)目,您顯然可以使用類別類型的枚舉,并為給定的注釋指定多個(gè)類別(“多重繼承”)。請注意,這些值完全是假的,僅用于演示目的:
@Target(ElementType.ANNOTATION_TYPE)public @interface Category { AnnotationCategory[] category();}public enum AnnotationCategory { GENERAL, SEMANTICS, VALIDATION, ETC}@Category(category={AnnotationCategory.GENERAL, AnnotationCategory.SEMANTICS})public @interface FooBarAnnotation {}

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超14個(gè)贊
從某種意義上說,你已經(jīng)擁有了Annotations - meta Annotations。如果使用元信息注釋注釋,則在許多方面等同于擴(kuò)展其他接口。注釋是接口,因此多態(tài)性并沒有真正發(fā)揮作用,并且由于它們本質(zhì)上是靜態(tài)的,因此不能進(jìn)行運(yùn)行時(shí)動(dòng)態(tài)調(diào)度。
在驗(yàn)證器示例中,您可以只在注釋上獲取帶注釋的類型,并查看它是否具有驗(yàn)證器元注釋。
我可以看到繼承有用的唯一用例是,如果你想能夠通過超類型獲得注釋,但這會(huì)增加一大堆復(fù)雜性,因?yàn)榻o定的方法或類型可能有兩個(gè)這樣的注釋,意味著必須返回一個(gè)數(shù)組而不是只返回一個(gè)對象。
所以我認(rèn)為最終的答案是用例是深?yuàn)W的,并且使更多標(biāo)準(zhǔn)用例復(fù)雜化,使其不值得。
添加回答
舉報(bào)