2015-04-01 110 views
-3

非靜態默認方法,在瀏覽的Java 1.8的java.util.Collections中的接口的源,我注意到了這一點,靜態公共方法和接口

default boolean removeIf(Predicate<? super E> filter) 
{ 
.... 
} 

所以爲1.8,Java允許方法接口定義身體。但是有一些語義特徵;如果該方法是公開的,我需要明確提到它也是靜態的,這是可以理解的,但爲什麼在默認情況下不執行?事實上,在默認情況下指定static會導致錯誤。這有什麼用途?

編輯:看到downvotes的號碼,我會鼓勵你先在懷疑

+3

如果該方法是公開的,我需要明確提及它static_你確定嗎? – 2015-04-01 19:07:48

+0

是的,我得到一個錯誤「接口抽象方法不能有正文」 – Rnet 2015-04-01 19:09:44

+1

你不是用Java 8編譯。「默認」方法不能是「靜態」。 「默認」方法隱含地是「公共」的。 – 2015-04-01 19:10:56

回答

2

我嘗試編譯下面的測試接口過早下結論之前嘗試了這一點:

public interface TestInterface { 
        void m(); 
      abstract void am(); 
      default void dm() { } 
      static void sm() { } 
    public   void pm(); 
    public abstract void pam(); 
    public default void pdm() { } 
    public static void psm() { } 
} 

使用的JDK我碰巧躺在身邊,即:8,8u5,8u11,8u25,8u40和一個jdk9-dev在幾天前的版本。它在所有這些版本上成功編譯。

正如其他人已經指出的,接口中的方法都是公開的,不管是否指定了public。另外,一個方法可以是抽象的,默認的或靜態的,並且如果沒有指定這些方法,則方法是抽象的。 (JLS 9.4)最後,聲明爲defaultstatic的方法必須具有用於正文的塊{ ... },而抽象方法(不論是否聲明)必須具有分號;作爲正文。 (JLS 9.4.3

如果該方法是公開的我需要明確提到它也是靜態的...但爲什麼這不是默認強制執行? (從comment)關鍵字靜態需要在那裏,如果它是公開的。

我沒有看到這個。所有接口方法都是公共的,無論它們是否被明確聲明。這與方法是靜態的或默認的正交。

事實上,指定靜態默認值會給出錯誤。

是的,一種方法可以是靜態或默認的,但不能同時使用兩種。

我得到一個錯誤「的界面抽象方法不能有身體」

如果您收到此錯誤,您必須指定塊{ ... }作爲身體的一個抽象方法,無論或者不將該方法顯式聲明爲抽象。

(JDK 9最近增加了對接口的私有方法的支持。)

0

所以爲1.8,Java允許在接口的方法來定義機構

不,不。您可以 - 實際上 - 必須爲方法標記爲defaultstatic。但是你不能爲抽象方法定義一個主體,而這正是你試圖去做的。

方法可以是abstractdefaultstatic。如果沒有使用關鍵字,那麼它是abstractabstract意味着沒有實現。 default表示具有一個實現,如果某個類沒有提供它自己的實現。標記爲static的方法是未繼承爲類。

所以他們都是不同的,服務於不同的目的,不能混合。默認方法應該被繼承,所以它不能是static