Java 功能界面

Java 功能界面,java,functional-interface,Java,Functional Interface,我是新的功能界面,今天我从几个教程网站学习。我有一个问题,请提供您的建议和指导我 下面提到的代码有一个问题 @FunctionalInterface interface Demo { Object clone(); // protected //int hashCode(); // public //boolean equals(Object c); // public //public void wait(); // final s

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

下面提到的代码有一个问题

@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()方法表示未重写,因为此方法是最终的。所以它意味着演示接口也是对象类的子类(一般来说)

问题:那么,现在代码在对象克隆()时工作方法未被注释。这意味着这个方法是在接口演示中声明的。但当我们点击它的实现时,我们将继续使用对象类的clone()方法

当我们注释clone()方法和uncomment equals()方法时,就会出现编译时错误,接口不是FunctionInterface。为什么?以及为什么它的函数接口是clone()方法

请不要说clone()受保护,如果clone在对象类中受保护,又有什么关系呢。请给我解释一下

谢谢,
sawai

由于
公共布尔等于(对象c)
已经存在于
对象中,
演示
没有声明任何新方法。要成为
功能接口
,它应该只声明一个方法

相反,当您声明
public Object clone()
时,这是一个新方法,因为
Object
中的原始方法受
保护。因此,它可以被视为一个
功能接口

这是因为
clone()
受到保护。我知道你让我不要这么说,但我还是要说,因为这就是答案

具体说来,

对于接口I,设M是 I的成员与任何公众没有相同的签名 类对象的实例方法。然后,我是一个功能接口 如果m中存在一个方法m,则以下两项都适用 正确:

m的签名是每个方法的子签名(§8.4.2) 以M

对于m中的每种方法,m是可替换的返回类型(§8.4.5)

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


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

你能分享JLS段落吗,因为它可以提供关于上述解释的更清晰和自信。请按照我答案中的链接进行操作。有一段斜体文字特别提到了
clone()
> @FunctionalInterface means interface with exact one method declaration.