Java 中的消费者接口

问题描述 投票:0回答:1

我在 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..");

  }

}
java java-8
1个回答
0
投票
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();
任何一个都可以正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.