静态引用(带有::)返回接口的方法

Gui*_*rré 12 java java-8 functional-interface method-reference

我有几个实现相同方法的预定义静态"处理器",例如:

default double process(double num){
Run Code Online (Sandbox Code Playgroud)

样品:

public class Test {
    public static void main(String[] args) {
        test(Test::processor1, 1d);
        test(Test::processor2, 1d);
    }

    static double processor1(double num){
        return num * 10;
    }

    static double processor2(double num){
        return num * 20;
    }
    //...

    static void test(Function<Double, Double> f, double d){
        // Do something util here
        System.out.println(f.apply(d));
    }   
    ...
Run Code Online (Sandbox Code Playgroud)

现在假设我有一些对象可以提供额外的"处理器"列表.

我正在尝试使用a interface来定义那些额外的"处理器".

    static interface IProcessor{
        double process(double num);
    }
Run Code Online (Sandbox Code Playgroud)

使用附加"处理器"实现对象:

    static class SomeObject{
        // Just return one but should be a list...
        static IProcessor getExtraProccessors(){
            return new IProcessor(){
                public double process(double num){
                    return num * 30;
                }
            };
        }   
    }  
Run Code Online (Sandbox Code Playgroud)

在这里,一切都编译并正常工作.但是现在我被卡住了.

使用SomeObject::getExtraProccessors我有一个返回接口的静态方法的参考,我如何调用接口的方法?

我的第一次尝试是

test(SomeObject::getExtraProccessors::process, 1d);
Run Code Online (Sandbox Code Playgroud)

但这不会编译给出一个 The target type of this expression must be a functional interface

那么请你告诉我是否可以这样做,如果是的话怎么样?如果不可能,我应该怎么做?

And*_*lko 7

test(SomeObject.getExtraProccessors()::process, 1);
Run Code Online (Sandbox Code Playgroud)
  • SomeObject.getExtraProccessors()返回功能接口的实例IProcessor.
  • SomeObject::getExtraProccessors是类的静态方法getExtraProccessor的方法引用SomeObject.