从已经退出的功能接口实现创建方法引用有什么意义(比如通过匿名 class)?

What is the point of creating method reference from already exiting implementation of functional interface (like via anonymous class)?

interface Foo<T> {
    T apply(T double1, T double2);
}

public class Test {
    static void calculate(Double double1, Double double2, Foo<Double> func) {
        double result = func.apply(double1, double2);
        System.out.println(result);
    }
    
    public static void main(String[] args) {
        double double1 = 100;
        double double2 = 0.2;
        calculate(double1, double2, new Foo<Double>() {
            
            public Double apply(Double double1, Double double2) {
                return double1 * (1+double2);
            }
        }::apply);
       //^^^^^^^---- does it improve anything? (code will work without it)
    }
}

我不明白在匿名 class 的构造结束时语法 ::apply 的用法。我不明白为什么这不会导致编译错误,我也不明白它实现了什么。

如果删除 ::apply,该程序将运行。那么为什么在这种情况下使用双冒号呢?

这确实是对 :: 运算符的错误使用。显式构造一个匿名 Foo<Double> 实例只是为了转身并使用 ::apply 提取 apply() 实现并创建一个 second 匿名函数是相当愚蠢的目的。它同时使用了两个等价的成语。一个就可以了。

正如您所说,放弃 ::apply 并直接使用匿名对象会更明智:

calculate(double1, double2, new Foo<Double>() {
    public Double apply(Double double1, Double double2) {
        return double1 * (1+double2);
    }
});

或者放弃匿名 Foo<Double> class 并使用 100% lambda 语法:

calculate(double1, double2, (a, b) -> a * (1 + b));

我更喜欢后者,因为它更简洁。