首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >功能界面

功能界面
EN

Stack Overflow用户
提问于 2016-11-22 06:08:49
回答 2查看 94关注 0票数 1

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

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

代码语言:javascript
复制
@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类的子类(一般情况下)。

代码语言:javascript
复制
> @FunctionalInterface means interface with exact one method declaration.

问题:所以,当对象克隆()时,代码正在工作;没有注释方法。这意味着这个方法是在接口Demo中声明的。但是,当我们单击它的实现时,我们就转移到对象类的克隆()方法上。

当我们评论克隆()方法和un-注释等于()方法时,我们得到编译时的错误,接口不是FunctionalInterface。为什么?以及为什么它的函数接口与克隆()方法。

请不要说克隆()是受保护的,如果在对象类中克隆是受保护的,有什么问题。请给我解释一下。

谢谢你,萨威

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-22 06:26:07

由于public boolean equals(Object c)已经存在于Object中,所以Demo不声明任何新方法。要成为一个FunctionalInterface,它应该只声明一个方法。

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

票数 0
EN

Stack Overflow用户

发布于 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()采取不同的对待方式。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40734900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档