我在 Mathod::nonStaticMethod 收到警告,“void 不是函数式接口”
Mathod::nonStaticMethod;这不应该起作用吗,这不是方法参考吗?
public class Mathod {
public static void taskDifferentiator() {
System.out.println("Static Method...");
}
public void nonStaticMethod() {
System.out.println("Non static method is called...");
}
public static void main(String args[]) {
Consumer nonStaticConsumer = () -> Mathod::nonStaticMethod;
System.out.println("End of the program..");
}
}
Consumer nonStaticConsumer = () -> Mathod::nonStaticMethod;
这里你混合了语法。
Type::someMethod
是
x -> Type.someMethod(x)
的另一种书写方式,其中 x
会增大或缩小以考虑 someMethod
所需的参数数量,例如如果是 public void someMethod(int x, String a) {}
,则 Type::someMethod
是 (x, a) -> Type.someMethod(x, a)
的缩写。
您还使用了 lambda 语法箭头表示法,因此您将两者结合起来。
() -> Mathod::nonStaticMethod
因此说:定义一个函数。该函数不带参数,并返回计算
Mathod::nonStaticMethod
的结果,它本身就是一个函数(因此,一个不带参数并返回不同函数的函数)。与所有 lambda (
->
) 和方法引用 (
::
) 一样,编译器必须从上下文中获取线索,以了解 lambda/MR 适应哪个函数接口。在这种情况下,您提供了一个 Consumer,并且 Consumer 接受 1 个参数并且不返回任何内容 (
void
),因此,编译器正在获取“箭头右侧的内容将被视为”的上下文线索
void
),这自然不是一个函数式接口。这解释了错误“void 不是函数式接口”。您可能想要的是以下其中之一:
Consumer<Mathod> nonStaticConsumer = m -> m.nonStaticMethod();
Consumer<Mathod> nonStaticConsumer = Mathod::nonStaticMethod();
任何一个都可以正常工作。