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

问题描述 投票:2回答:2

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

@FunctionalInterface
interface Normal{
    public abstract String move();
    public abstract String toString() ;
}

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

java java-8 functional-programming
2个回答
3
投票

引用的Alok是正确的,但是他忽略了某些东西,这使得他的最终答案(该代码无效)是错误的:

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

package de.scrum_master.stackoverflow;

@FunctionalInterface
interface Normal {
  String move();
  String toString();
}

BTW,因为接口方法始终是,所以无需将接口方法声明为publicabstract也一样。

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");
  }
}

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

xxx
de.scrum_master.stackoverflow.NormalApp$$Lambda$1/1530388690@28c97a5

现在,如果您将方法名称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

0
投票

首先,Nitin,您需要对此进行适当的研究,然后您应该在此平台上询问您的问题。

尽管如此,首先,让我清除您对Java 8中的功能接口]的疑问。>>

  1. Java 8中的功能接口只能具有一个抽象方法和任意数量的默认方法。

  • 从Java 8开始,lambda表达式可用于表示功能接口的实例。
  • @@ FunctionalInterface批注用于确保功能接口不能使用多个抽象方法。如果存在多个抽象方法,则编译器会标记Unexpected @FunctionalInterface annotation消息。但是,使用此注释不是强制性的。
  • 仅根据您的代码,我可以看到两个抽象方法,因此您的代码无效。

    我希望可以以某种方式对您有所帮助。有关更多信息,请查看此链接:Java 8 Functional Interface

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