[英]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的一個新功能是可以使用默認方法擴展現有接口。 默認方法不僅被聲明,而且還在接口中定義。
重點要注意
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.