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.