2014-10-09 93 views
9

一邊唸叨標記接口我偶然發現了以下站點:Item 37: Use marker interfaces to define types
這裏,根據約書亞·布洛克有過的標記註釋標記接口兩個優點。標記註釋VS標記接口

  1. 標誌接口定義由的 標記類實例中實現的類型;標記註釋不。這個 類型的存在允許您在編譯時發現錯誤,如果您使用了標記註釋,那麼您將無法捕獲到運行時間爲 。

  2. 標記界面超過標記註釋的另一個優勢是 它們可以更精確地定位。如果註釋類型爲 ,並且目標爲ElementType.TYPE,則它可以應用於任何 類或接口。假設您有一個標記僅適用於特定界面的實現 。如果您將它定義爲標記界面,則可以將其擴展到適用的唯一界面 ,以確保所有標記的類型也是其適用的唯一界面的子類型 。

OK,第一點是理解,但我不知道如果我理解正確的第二點:

如果註釋類型與目標ElementType.TYPE宣佈,它可以應用到任何類或接口。

同樣,如果我有標記接口,那麼也可以應用於任何類或接口。它不是說關於標記註釋和標記接口的事情嗎? 標記界面如何更準確地瞄準?

的第二點還提到:

可以有[標記接口]延伸的唯一接口,它是適用的,保證所有標記類型也是唯一的接口的亞型,其它是適用的。

你能不能也說明實現這一目標,通過使用@Inherited元註釋

+0

我編輯了這個問題,使它更容易理解。如果我改變太多,你當然可以改變它。 – Kapep 2016-02-04 19:28:31

回答

7

標記界面如何能更精確地瞄準?

你是對的,兩者都可以應用於任何類型。通過「更精確地定位」作者意味着您可以添加額外的限制,標記界面可應用於哪些特定類型。無法爲註釋添加相同的精確限制:如果註釋限制爲ElementType.TYPE,則始終可以將其應用於所有類型。

第二點的另一部分詳細介紹瞭如何添加這些限制。如果你有一個標記接口,你可以讓它擴展另一個接口(這是作者調用唯一接口)是這樣的:

interface Marker extends Foo { } 

標記現在只能被應用到實現Foo類型。

你能不能也說明實現這一目標,通過使用@Inherited元註釋

不,@Inherited元註釋僅意味着註釋類的任何子類型都將被視爲具有相同的註釋。它不會對註釋可應用於哪些類型施加任何限制。

+1

您的答案有一定意義..感謝您的解釋.. – Mac 2014-10-12 12:36:06

+0

我無法理解這個討論 - 無論是問題還是答案... – 2016-02-03 19:02:03

+0

@kapep:是作者 - Joshua Bloch試圖說明註釋不能被繼承? – 2016-02-03 19:03:40