FunctionalInterfaces不计算Object类的方法

时间:2019-12-28 12:47:33

标签: java functional-interface

  @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>

1 个答案:

答案 0 :(得分:1)

这是在JLS中指定的。

  

功能接口的定义排除了接口中的方法,这些方法也是Object中的公共方法。这是为了允许对java.util.Comparator之类的接口进行功能处理,该接口声明多个抽象方法,其中只有一个是真正的“新”方法-int compare(T,T)。另一个方法boolean equals(Object)是对抽象方法的显式声明,否则将隐式声明该抽象方法,并将由实现该接口的每个类自动实现。

     

请注意,如果在接口中声明了Object的非公共方法(例如clone()),则不会由实现该接口的每个类自动实现它们。从Object继承的实现受到保护,而接口方法必须是公共的。实现此类接口的唯一方法是让类使用public方法覆盖非public Object方法。

接口没有隐式具有clone()和finalize()方法,因此对于接口来说,这是一个新方法,因此不能认为它覆盖了任何内容。

在这种情况下,实现类将必须专门重写clone()finalize(),否则会产生语法错误,因为它们具有受保护的可见性,并且声称实现从接口继承的方法具有公众知名度。