首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >接口中常见默认方法的菱形问题

接口中常见默认方法的菱形问题
EN

Stack Overflow用户
提问于 2018-05-13 23:58:34
回答 2查看 77关注 0票数 0

我正在尝试理解为什么下面的程序不能编译。两个默认方法的返回类型在两个接口中是不同的。在接口c中,它们应该被视为两个不同的方法吗?

代码语言:javascript
运行
复制
interface a{
    default void log(String str){
        System.out.println("I1 logging::"+str);
    }  
}

interface b {
    default int log(String str){
        System.out.println("I1 logging::"+str);
        return 0;
    }
}

interface c extends a,b{
}

日志:错误:类型b和a不兼容;都定义了HelloWorld.java:32(java.lang.String),但接口c使用不相关的返回类型扩展了a,b{ }

EN

回答 2

Stack Overflow用户

发布于 2018-05-14 00:16:20

您的默认实现既不遵循重写(维护协变返回类型),也不重载(参数不同)。

有关详细信息,请参阅以下内容:

Covariant return types in Java

What is a covariant return type?

票数 1
EN

Stack Overflow用户

发布于 2018-05-14 00:17:02

根据Java Language Specification的说法

如果两个方法或构造函数( M和N )具有相同的名称、相同的类型参数(如果有),则它们具有相同的签名(§8.4.4),并且在将N的形参类型调整为M的类型参数后,具有相同的形参类型。

您的接口包含具有相同签名的方法(相同的方法名称和参数类型)

在一个类中声明两个具有覆盖等效签名的方法是编译时错误。

因此,您不能在类中同时实现这两个接口。(实际上,编译器不能仅通过返回type_来区分函数)

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

https://stackoverflow.com/questions/50317985

复制
相关文章

相似问题

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