相关疑难解决方法(0)

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

在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;  
}  
Run Code Online (Sandbox Code Playgroud)

我想知道是否有任何方法可以在接口中定义方法体?
什么是default关键字,它是如何工作的?

java interface java-8

90
推荐指数
3
解决办法
5万
查看次数

使用祖父窗口的默认方法

我完全迷失了为什么那不起作用:

interface Test {

    default void doMagic() {
        System.out.println("Abracadabra");
    }
}

class TestImpl implements Test {

}

class SpecialTestImpl extends TestImpl {

    public void doMagic() {
        Test.super.doMagic(); // Error: No enclosing instance of the type Test is accessible in scope
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一些奇怪的Eclipse错误消息(它也无法应对Lamdas,所以也许Mars还没有完全准备好Java 8)?

我可以通过直接让SpecialTestImpl工具Test(它产生警告,因为它是不必要的)或覆盖方法来解决它(由于TestImpl相同的原因产生警告).

那么为什么我不能调用超级方法呢?

我的猜测是因为如果我能够Test.super.doMagic()直接调用,实现该方法TestImpl会破坏API,SpecialTestImpl即使它不应该.但是如果我让SpecialTestImpl实现Test并以这种方式调用默认方法也是如此.

java eclipse java-8

5
推荐指数
1
解决办法
228
查看次数

标签 统计

java ×2

java-8 ×2

eclipse ×1

interface ×1