<分区>
在 java 8 中我有这样的东西:
package test;
public class SimpleFuncInterfaceTest {
public static void carryOutWork(AFunctionalInterface sfi){
sfi.doWork();
}
public static void main(String[] args) {
carryOutWork(() -> System.out.println("Do work in lambda exp impl..."));
AImplementor implementsA = new AImplementor();
//carryOutWork(() -> implementsA.doWork());
BImplementor implementsB = new BImplementor();
carryOutWork(() -> implementsB.doWork());
}
}
@FunctionalInterface
interface AFunctionalInterface {
public void doWork();
default public void doSomeWork(){
System.out.println("FOO");
}
}
@FunctionalInterface
interface BFunctionalInterface extends AFunctionalInterface {
@Override
default public void doSomeWork(){
System.out.println("BAR");//Unreachable in same object?
}
}
class AImplementor implements AFunctionalInterface {
@Override
public void doWork() {
doSomeWork();
}
}
class BImplementor extends AImplementor implements BFunctionalInterface {
public void doSomeWork(){
super.doSomeWork();
new BFunctionalInterface(){
@Override
public void doWork() {
}}.doSomeWork();
System.out.println("WUK WUK");
}
@Override
public void doWork() {
doSomeWork();
}
}
有没有一种方法可以从 implementsB 调用默认功能接口(interface)行为而不必创建匿名内部类并调用它?
这有一个副作用(调用 implementsA 的方法 2 次),需要的是调用父级的实现,然后让子级的实现能够调用子级的默认实现,如果需要的话还可以进行一些专门化。如您所见,调用父接口(interface)的实现非常容易,但我看不到避免重写默认实现的方法,除非我向实现子接口(interface)的类添加一个间接层,并且没有办法强制执行它.
例如,如果 A 解锁或提供对资源(例如数据库)的访问权限,而 B 解锁第二个资源(另一个数据库),我认为没有办法让代码解锁 A,然后 B 通过使用功能接口(interface)来执行此契约(Contract),要求调用 A 和 B。 一层深你可以做到,但N层深看起来是不可能的。
我打算使用 lambda 来避免进行昂贵的调用,但对我的库的用户强制执行语义操作顺序。
这个问题与“在 Java 中显式调用默认方法”不完全相同,因为这个问题是关于接口(interface) N 层深的,而不仅仅是调用父接口(interface)的默认方法。