Java 8 静态与默认方法-功能接口

Java 8 静态与默认方法-功能接口,java-8,functional-programming,Java 8,Functional Programming,我正在创建功能接口,并希望在匿名实现中重用默认方法 public class JavaInterfaceTest { public static void main(String[] args) { FunctionalIntf fi = () -> { System.out.println("In ananymus impl, trying to call default method"); // doInternal() re

我正在创建功能接口,并希望在匿名实现中重用默认方法

public class JavaInterfaceTest {

public static void main(String[] args) {

    FunctionalIntf fi = () -> {
        System.out.println("In ananymus impl, trying to call default method");
        // doInternal()
        return "Hello";

    };

    fi.doFunction(); // How this line valid ?
    fi.doInternal();

    FunctionalIntf.doSomething();

    }

}

@FunctionalInterface
interface FunctionalIntf {

String doFunction();

default void doInternal(){
    System.out.println("In doInternal");
}

static void doSomething(){
    System.out.println("In doSomething");
}

}
fi.dof如何发挥作用;是有效的,如果我通过匿名实现。 如果我想从实现中恢复默认方法或静态方法,我该如何恢复?
三,。在我的情况下,返回的是有效的/最佳实践,因为我无法处理返回的值。

在创建匿名类时,实际上是从FunctionNTF接口为抽象方法doFunction提供了一个实现。因此,当您使用这一行代码时:

fi.doFunction();
这意味着您正在从匿名类调用doFunction方法。这是关于功能接口如何工作的另一个示例:

Runnable r = new Runnable() {
    @Override
    public void run() {
        System.out.println("I'm Runnable!");
    }
};
r.run();
在本例中,我们从Runnable接口重写run方法,该接口也是一个函数接口

无法为静态方法提供另一个实现,因为无法重写静态方法。静态方法在Java中根本不会被继承。相反,您可以通过重写为默认方法提供另一个实现,如上面的示例所述


关于返回值,您需要定义方法以返回所需的确切值。这方面没有最佳实践。

当您实现功能接口时,有两个选项:

使用lambdas,正如您所做的那样 使用内部类。 如果您像以前一样使用lambdas,那么您将拥有静态/默认方法的默认实现以及抽象方法的实现


如果使用内部类,则通常的重写规则适用。

fi.doFunction;我没有打电话。不打印文本。我只是测试它,结果是:在Anonymus impl中,尝试调用默认方法。您提出了三个完全不同的问题。此外,您似乎提出了错误的问题,如“How fi.doFunction;是否有效”,因为fi是接口类型的变量,并且您正在对其调用其定义的方法之一,所以为什么它不有效?