首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么接口在例1中抛出编译时错误,但在第2种情况下成功编译

为什么接口在例1中抛出编译时错误,但在第2种情况下成功编译
EN

Stack Overflow用户
提问于 2018-10-25 18:45:35
回答 1查看 134关注 0票数 2

我在"CASE 1“中有两个接口,其中我有相同的方法和不同的返回类型,我在另一个接口中扩展了两个接口,然后我得到了编译时错误,因为返回类型对于继承的方法是不兼容的,但是在这里,当我们在第三个接口中扩展两个接口时,方法会重载,而在方法中,重载返回类型没有影响,那么为什么会出现这个错误呢?

另外,如果我在"CASE 2“中两个返回类型相同的接口中是相同的方法,并且在第三个接口中扩展了这两个接口,那么这里不会出现任何错误。为什么?

案例1

Interface1.java

代码语言:javascript
复制
public interface I1
{
int m();
}

Interface2.java

代码语言:javascript
复制
public interface I2
{
void m();
}

Interface3.java

代码语言:javascript
复制
public interface I3 extends I1,I2
{

}

案例2

Interface1.java

代码语言:javascript
复制
public interface I1
{
int m();
}

Interface2.java

代码语言:javascript
复制
public interface I2
{
int m();
}

Interface3.java

代码语言:javascript
复制
public interface I3 extends I1,I2
{

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-25 18:48:31

在第一种情况下,接口不一致。任何类都不可能实现它,因为它不能满足“必须有一个int m()方法”和“必须有一个void m()方法”的约束。

您说“在方法重载中,返回类型没有影响”--这并不完全正确。在方法重载中,返回类型不是签名的一部分。您不能只更改返回类型来重载方法,这正是因为它们具有相同的签名:

代码语言:javascript
复制
class Foo
{
    public void m() {}
    public int m() { return 1; }
}

结果:

代码语言:javascript
复制
error: method m() is already defined in class Foo

在第二种情况下,接口是一致的。完全有可能实现它,只需使用一个方法int m() { ... }。使用单一方法同时实现I1.mI2.m这一事实并不是一个问题。

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

https://stackoverflow.com/questions/52996138

复制
相关文章

相似问题

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