我是新的功能界面和今天,我是从几个教程网站学习。我有一个问题,请提供你的建议并指导我。
下面提到的代码有一个问题要问我。
@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.问题:所以,当对象克隆()时,代码正在工作;没有注释方法。这意味着这个方法是在接口Demo中声明的。但是,当我们单击它的实现时,我们就转移到对象类的克隆()方法上。
当我们评论克隆()方法和un-注释等于()方法时,我们得到编译时的错误,接口不是FunctionalInterface。为什么?以及为什么它的函数接口与克隆()方法。
请不要说克隆()是受保护的,如果在对象类中克隆是受保护的,有什么问题。请给我解释一下。
谢谢你,萨威
发布于 2016-11-22 06:26:07
由于public boolean equals(Object c)已经存在于Object中,所以Demo不声明任何新方法。要成为一个FunctionalInterface,它应该只声明一个方法。
当您声明public Object clone()时,它是一个新方法,因为Object中的原始方法是protected。因此,它可以被认为是一个FunctionalInterface。
发布于 2016-11-22 06:28:54
这是因为clone()受到保护。我知道你让我不要这么说,但我还是要说,因为这是答案。
http://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.8特别指出:
对于接口I,让M是一组抽象方法,它们是I的成员,与类对象的任何公共实例方法没有相同的签名。然后,如果存在M中的方法m,则I是一个函数接口,对于M,以下两种方法都是正确的: M的签名是每种方法在M中签名的子签名(§8.4.2)。 M是M中每种方法的返回类型替换(§8.4.5)。
请注意,它写的是公共实例。当您取消注释clone()时,这是一个与公共实例方法没有相同签名的方法,因为clone()在Object中是一个受保护的实例方法。因此,您的clone()方法将满足这些条件。对于equals(),您不能这样说,因为equals()是Object中的一个公共实例方法。这意味着这个规则所指的集合M是空的,因此必须在这个集合中的方法m不存在。
在JLS的下面几段中有一条评论,解释了为什么他们决定对clone()采取不同的对待方式。
https://stackoverflow.com/questions/40734900
复制相似问题