簡體   English   中英

接口中定義的方法的“默認”實現是什么?

[英]What is the “default” implementation of method defined in an Interface?

在Collection Interface中,我找到了一個名為removeIf()的方法,其中包含了它的實現。

default boolean removeIf(Predicate<? super E> filter) {
    Objects.requireNonNull(filter);  
    boolean removed = false;  
    final Iterator<E> each = iterator();   
    while (each.hasNext()) {  
        if (filter.test(each.next())) {  
            each.remove();  
            removed = true;  
        }  
    }  
    return removed;  
}  

我想知道是否有任何方法可以在接口中定義方法體?
什么是default關鍵字,它是如何工作的?

來自https://dzone.com/articles/interface-default-methods-java

Java 8引入了“默認方法”或(Defender方法)新功能,它允許開發人員在不破壞這些接口的現有實現的情況下向接口添加新方法。 它提供了允許接口定義實現的靈活性,在具體類無法為該方法提供實現的情況下,該實現將默認使用。

public interface A {
    default void foo(){
       System.out.println("Calling A.foo()");
    }
}

public class ClassAB implements A {
}

當人們第一次聽到新功能時,有一個常見問題是人們會詢問默認方法:

如果該類實現了兩個接口並且這兩個接口都定義了具有相同簽名的默認方法,該怎么辦?

舉例來說明這種情況:

public interface A {  
    default void foo(){  
        System.out.println("Calling A.foo()");  
    }  
}

public interface B {
    default void foo(){
        System.out.println("Calling B.foo()");
    }
}


public class ClassAB implements A, B {

}  

此代碼無法使用以下結果進行編譯:

java: class Clazz inherits unrelated defaults for foo() from types A and B

要解決這個問題,在Clazz中,我們必須通過覆蓋沖突的方法來手動解決它:

public class Clazz implements A, B {
    public void foo(){}
}

但是如果我們想從接口A調用方法foo()的默認實現而不是實現我們自己的方法呢。

可以如下引用A#foo():

public class Clazz implements A, B {
    public void foo(){
       A.super.foo();
    }
}

這些方法稱為默認方法。 默認方法Defender方法是Java 8中新增的功能之一。

它們將用於允許接口方法在具體類不提供該方法的實現的情況下提供用作缺省的實現。

所以,如果你有一個接口,使用默認方法:

public interface Hello {
    default void sayHello() {
        System.out.println("Hello");
    }
}

以下類完全有效:

public class HelloImpl implements Hello {

}

如果您創建HelloImpl的實例:

Hello hello = new HelloImpl();
hello.sayHello();  // This will invoke the default method in interface

有用的鏈接:

我做了一些研究,我發現了以下內容。 希望這可以幫助。

存在問題

普通接口方法聲明為抽象,必須在實現接口的類中定義。 這會給班級實施者帶來“負擔”,他們有責任實施所有宣稱的方法。 更重要的是,這也意味着在“發布”之后無法擴展接口。 否則,所有實施者都必須調整其實現,打破后向源和二進制兼容性。

Java 8中采用的解決方案

為了解決這些問題,JDK 8的一個新功能是可以使用默認方法擴展現有接口。 默認方法不僅被聲明,而且還在接口中定義。

重點要注意

  1. 實現者可以選擇不在實現類中實現默認方法。
  2. 實現者仍然可以覆蓋默認方法,例如可以在子類中重寫常規非final類方法。
  3. 抽象類甚至可以(重新)將默認方法聲明為抽象,從而強制子類重新實現該方法(有時稱為“重新抽象”)。

暫無
暫無

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

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