@FunctionalInterface
interface Superman {
//public methods in java.lang.Object class
String toString();
int hashCode();
boolean equals(Object obj);
//Protected method in java.lang.Object class
//Object clone() throws CloneNotSupportedException;
void finalize() throws Throwable;
}
SAM =(单一抽象方法)
我的问题是 @FunctionalInterface 并不将公共方法视为 SAM ,而是将受保护的方法视为 SAM 。 / p>
答案 0 :(得分:1)
这是在JLS中指定的。
功能接口的定义排除了接口中的方法,这些方法也是Object中的公共方法。这是为了允许对java.util.Comparator之类的接口进行功能处理,该接口声明多个抽象方法,其中只有一个是真正的“新”方法-int compare(T,T)。另一个方法boolean equals(Object)是对抽象方法的显式声明,否则将隐式声明该抽象方法,并将由实现该接口的每个类自动实现。
请注意,如果在接口中声明了Object的非公共方法(例如clone()),则不会由实现该接口的每个类自动实现它们。从Object继承的实现受到保护,而接口方法必须是公共的。实现此类接口的唯一方法是让类使用public方法覆盖非public Object方法。
接口没有隐式具有clone()和finalize()方法,因此对于接口来说,这是一个新方法,因此不能认为它覆盖了任何内容。
在这种情况下,实现类将必须专门重写clone()
和finalize()
,否则会产生语法错误,因为它们具有受保护的可见性,并且声称实现从接口继承的方法具有公众知名度。