接口中定义的方法的“默认”实现是什么?

2022-08-31 10:26:07

在集合接口中,我找到了一个名为包含其实现的方法。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


答案 1

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();
    }
}

答案 2

这些方法称为默认方法。默认方法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

有用的链接: