为什么我的 @FunctionalInterface 有两种方法没有编译错误?

Nit*_*n T 8 java functional-programming java-8

下面的接口是 Java 8 中有效的功能接口吗?

@FunctionalInterface
interface Normal{
    public abstract String move();
    public abstract String toString() ;
}
Run Code Online (Sandbox Code Playgroud)

为什么它不给我一个编译时错误?

kri*_*aex 10

什么阿洛克报价是真实的,但他忽略了什么,这让他的最终答案(代码是无效的)错误:

该接口有一个方法String toString(),每个类都已经实现了,从Object. 即声明的接口方法已经有一个实现,类似于默认方法。因此,没有编译错误,Normal可以用作功能接口,如我的MCVE所示:

package de.scrum_master.stackoverflow;

@FunctionalInterface
interface Normal {
  String move();
  String toString();
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,不需要声明接口方法,public因为它们总是如此。也一样abstract

package de.scrum_master.stackoverflow;

public class NormalApp {
  static void doSomething(Normal normal) {
    System.out.println(normal.move());
    System.out.println(normal.toString());
  }

  public static void main(String[] args) {
    doSomething(() -> "xxx");
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您运行驱动程序应用程序,您将看到此控制台日志:

xxx
de.scrum_master.stackoverflow.NormalApp$$Lambda$1/1530388690@28c97a5
Run Code Online (Sandbox Code Playgroud)

现在,如果您将方法名称更改为toString其他名称,例如toStringX,您将看到由于@FunctionalInterface编译类时出现预期的错误消息:

Unexpected @FunctionalInterface annotation
  de.scrum_master.stackoverflow.Normal is not a functional interface
    multiple non-overriding abstract methods found in interface de.scrum_master.stackoverflow.Normal
Run Code Online (Sandbox Code Playgroud)