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)