功能界面

时间:2016-11-22 06:08:50

标签: java functional-interface

我是功能界面的新手,今天我从很少的教程网站学习。我有一个问题,请提供您的建议并指导我。

下面提到的代码对我有疑问。

@FunctionalInterface
interface Demo {
    Object clone();   // protected
    //int hashCode();              // public
    //boolean equals(Object c); // public
    //public void wait(); // final so we cannot override this one.
}

对象类是所有java类的父类。 这里wait()方法没有覆盖,因为这是最终的。所以它意味着Demo接口也是Object类的子类(一般来说)。

> @FunctionalInterface means interface with exact one method declaration.

问题:所以,当对象clone(); 方法未被注释时,现在代码正常工作。因此意味着此方法在接口Demo中声明。但是当我们点击它的实现时,我们将继续使用Object类的clone()方法。

当我们注释clone()方法并取消注释equals()方法时,我们得到编译时错误,接口不是FunctionalInterface。为什么??????以及为什么它的功能接口与clone()方法。

请不要说clone()受保护,如果clone在Object类中受到保护,那该怎么办?请解释一下。

谢谢, 泽井

2 个答案:

答案 0 :(得分:2)

这是因为clone()受到保护。我知道你让我不要这么说,但无论如何我都会这么说,因为这就是答案。

http://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.8具体说:

  

对于接口I,让M成为一组抽象方法   我的成员与任何公众都没有相同的签名   Object类的实例方法。然后,我是一个功能界面   如果在M中存在方法m,则以下两者都是   真:

     

m的签名是每种方法的子签名(§8.4.2)   签名在M。

     对于M中的每个方法,

m都是返回类型可替换的(第8.4.5节)。

请注意,它说 public 实例。当您取消注释clone()时,这是一种与公共实例方法具有相同签名的方法,因为clone()中的Object是受保护的实例方法。因此,您的clone()方法将满足条件。你不能对equals()说同样的话,因为equals()Object中的公共实例方法。这意味着此规则引用的集合 M 为空,因此必须在此集合中的方法 m 不能存在。

JLS中有一段评论下来几段,这解释了为什么他们决定以不同的方式对待clone()

答案 1 :(得分:0)

由于public boolean equals(Object c)中已存在ObjectDemo并未声明任何新方法。要成为FunctionalInterface,它应该只声明一种方法。

当您声明public Object clone()时,它是一种新方法,因为Object中的原始方法是protected。因此,它可以被视为FunctionalInterface