目标类型的表达式必须是一个功能接口 - 为什么需要它?

diw*_*att 3 java lambda compiler-errors java-8 functional-interface

我已经经历了许多具有相同标题的问题,但我没有得到我正在寻找的答案.

Greeter下面的课程中有一个简单的sysout.据我了解,lambda关心的是签名(即返回类型和参数数量).但如果我删除

int add(int a);

它完美有效,因为编译器将检查Greeting接口中是否有任何可用的方法没有参数且返回类型为void.

但是当我在那里保留那个方法时,我得到了主题行中提到的编译错误,根据我的理解编译器将转到Greeting接口,它将看到有两种方法.但是应该没有歧义,因为我的lambda表达式查找返回类型为void且只有一个参数的方法.基于这个类比,只有一种方法,所以理想情况下它不应该给出错误.

我知道我的比喻在这里是错误的,我知道它必须是一个功能界面,但我也认为我上面提到的过程正是编译器的工作方式.

任何人都可以让我知道我错在哪里以及编译器在我的例子中是如何工作的?

问候界面

package lambadas;

public interface Greeting {
    void perform();
    int add(int a);
}
Run Code Online (Sandbox Code Playgroud)

迎宾班

package lambadas;

public class Greeter {

    public static void main(String[] args) {
        Greeting l = () -> System.out.println("hello");
        l.perform();
    }
}
Run Code Online (Sandbox Code Playgroud)

HelloWorldGreeting

package lambadas;

public class HelloWorldGreeting implements Greeting {

    @Override
    public void perform() {
        System.out.println("hello world.!");
    }
    @Override
    public int add(int a) {
      return 0;
    }

}
Run Code Online (Sandbox Code Playgroud)

Eug*_*ene 5

@FunctionalInterface- 注释你的界面- 并看到它破裂.只有一个单一的抽象方法是允许的.