在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关键字,它是如何工作的?
我完全迷失了为什么那不起作用:
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并以这种方式调用默认方法也是如此.