下面的接口在Java 8中是有效的功能接口吗?
@FunctionalInterface
interface Normal{
public abstract String move();
public abstract String toString() ;
}
为什么不给我一个编译时错误?
引用的Alok是正确的,但是他忽略了某些东西,这使得他的最终答案(该代码无效)是错误的:
接口有一个方法String toString()
,每个类都已经实现了该方法,该方法继承自Object
。即声明的接口方法已经有一个实现,类似于默认方法。因此,没有编译错误,并且Normal
可以用作功能接口,如我的MCVE中所示:
package de.scrum_master.stackoverflow;
@FunctionalInterface
interface Normal {
String move();
String toString();
}
BTW,因为接口方法始终是,所以无需将接口方法声明为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
首先,Nitin,您需要对此进行适当的研究,然后您应该在此平台上询问您的问题。
尽管如此,首先,让我清除您对Java 8中的功能接口]的疑问。>>
Unexpected @FunctionalInterface annotation
消息。但是,使用此注释不是强制性的。仅根据您的代码,我可以看到两个抽象方法,因此您的代码无效。 我希望可以以某种方式对您有所帮助。有关更多信息,请查看此链接:Java 8 Functional Interface