首页 > 解决方案 > 在 BiFunction 中存储另一个类的静态函数时出错

问题描述

我有两个类,在其中一个类中,我想创建一个变量来保存另一个类的函数。我想这样做,这样我就可以有条件地改变行为。

我尝试了以下导致编译错误的原型:

class A {
    public String myFn(int a, int b) {
        return "<" + a + " " + b + ">";
    }
    public String myFn2(int a, int b) {
        return "(" + a + " " + b + ")";
    }
}

class B {
    static int mode = 1;
    public void fn() {
        BiFunction<Integer, Integer, String> fn = null;
        if(mode == 1) {
            fn = ClassA.myFn(); // This results in an error "Cannot resolve method fn()".
        }
        else {
            //fn = ClassA.myFn2();
        }

        // next I will use fn ...

    }
}

这会导致错误“无法解析方法 fn()”。

如何存储该功能?

谢谢。

标签: javafunctional-programming

解决方案


调用ClassA.myFn()需要方法是静态的这是一个方法调用,你不想存储方法,而不是调用它。

  1. 拉姆达

    BiFunction<Integer, Integer, String> fn = null;
    if(mode == 1) {
        fn = (a, b) -> ClassA.myFn(a, b); 
    }
    
  2. 方法参考

    BiFunction<Integer, Integer, String> fn = null;
    if(mode == 1) {
        fn = ClassA::myFn; 
    }
    

⚠️还有

  • 两者都myFn应该myFn2是静态的

    public static String myFn(int a, int b) {
        return "<" + a + " " + b + ">";
    }
    
  • 选择ClassAA但它们应该匹配

    class ClassA {
    

推荐阅读