在 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(("。

如何存储函数?

谢谢。

调用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; 
    }
    

⚠️ 也

  • myFnmyFn2都应该是静态

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

    class ClassA {
    

您的方法myFn不是静态的,因此您无法像尝试的那样在静态上下文中访问它。 您的类也称为A,但您将其引用为ClassA。 此外,在分配BiFunction时,当您需要 lambda 表达式时,您可以将其分配给返回值。 下面是示例的编辑副本:

class A {
public static String myFn(int a, int b) { //notice the static keyword
return "<" + a + " " + b + ">";
}
public static String myFn2(int a, int b) { //notice the static keyword
return "(" + a + " " + b + ")";
}
}
class B {
static int mode = 1;
public void fn() {
BiFunction<Integer, Integer, String> fn = null;
if(mode == 1) {
fn = A::myFn; // use a lambda expression, and class is named A
}
else {
//fn = A::myFn2;
}
// next I will use fn ...
}
}

最新更新