@FunctionalInterfaces可以有默认方法吗?
为什么我无法使用默认方法实现创建?@FunctionalInterface
@FunctionalInterface
public interface MyInterface {
default boolean authorize(String value) {
return true;
}
}
为什么我无法使用默认方法实现创建?@FunctionalInterface
@FunctionalInterface
public interface MyInterface {
default boolean authorize(String value) {
return true;
}
}
您可以在函数接口中使用默认方法,但其协定要求您提供一个抽象方法(或 SAM)。由于默认方法具有实现,因此它不是抽象的。
从概念上讲,函数接口只有一个抽象方法。由于默认方法具有实现,因此它们不是抽象的。
和
如果某个类型是用此注释类型批注的,则编译器需要生成错误消息,除非:
该类型是接口类型,而不是注释类型、枚举或类。
带注释的类型满足功能接口的要求。
在这里,您不能满足功能接口的要求,因此您需要提供一个抽象方法。例如:
@FunctionalInterface
interface MyInterface {
boolean authorize(int val);
default boolean authorize(String value) {
return true;
}
}
请注意,如果声明一个抽象方法重写 Object 类中的公共方法之一,则该方法不计算在内,因为此接口的任何实现都将至少通过 Object 的类实现这些方法。例如:
@FunctionalInterface
interface MyInterface {
default boolean authorize(String value) {
return true;
}
boolean equals(Object o);
}
不编译。
功能接口是具有单个抽象方法的接口。定义函数接口的整个目的是通过lambda表达式实现单个抽象方法,这将有效地覆盖该方法,这使得为它提供实现毫无意义。interface
default
完全由方法组成会引起多个问题。存在一个技术问题,即当有多个方法时,编译器无法为lambda表达式决定实现哪种方法,并且存在完全由方法组成的语义问题。您无法实例化此默认行为,因为您无法实例化 s,并且强制程序员创建具体类只是为了调用默认行为,由于接口是无状态的,因此可以由单例提供:interface
default
default
interface
default
abstract
interface
@FunctionalInterface
public interface MyInterface {
static MyInterface DEFAULT = s->true;
boolean authorize(String value);
}
请注意,如果需要,可以使用扩展功能接口并提供默认方法的接口。不过,如果这导致创建一个没有抽象的方法,我会质疑这个设计。您可以与有关使用默认
方法的标记接口的讨论进行比较。如果子接口具有与功能接口不同的抽象方法,那就另当别论了。这可能有实际的用例,但这些子接口还将演示为什么它们不应该与函数库混合,因为lambda表达式将始终实现抽象方法。interface
interface