我有两个类,在其中一个类中,我想创建一个变量来保存另一个类的函数。我想这样做,这样我就可以有条件地改变行为。
我尝试了以下原型,导致编译错误:
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()
需要该方法是静态的,这是一个方法调用,您不想存储该方法,而不是调用它。
拉姆达
BiFunction<Integer, Integer, String> fn = null; if(mode == 1) { fn = (a, b) -> ClassA.myFn(a, b); }
方法参考
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 + ">"; }
选择
ClassA
或A
,但它们应该匹配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 ...
}
}