【问题标题】:Why is there no compile error for my @FunctionalInterface with two methods?为什么我的@FunctionalInterface 使用两种方法没有编译错误?
【发布时间】:2020-02-23 06:48:23
【问题描述】:

下面的接口是 Java 8 中有效的函数式接口吗?

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

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

【问题讨论】:

  • 为什么不给我编译时错误
  • 能否分享您运行代码的平台的日志?
  • 有趣的问题。我不明白接近投票。但是尼丁,请学习如何写出好问题。不要只是发布代码,还要将实际问题放入您的文本中,而不是标题或评论中。如果您想在问题中添加一些内容,请编辑问题而不是评论。这次我会为你做的。还请注意学习如何使用代码块,我还修复了您的代码格式。
  • 简而言之:方法的传递声明。

标签: java java-8 functional-programming


【解决方案1】:

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

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

package de.scrum_master.stackoverflow;

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

顺便说一句,不需要将接口方法声明为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");
  }
}

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

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

【讨论】:

  • Kriegaex 的好答案。
  • 很好的解释,+1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 2011-08-02
  • 1970-01-01
相关资源
最近更新 更多