为什么案例1中的接口抛出编译时错误,但案例2中的编译成功

时间:2018-10-25 18:45:36

标签: java interface overloading

我在“案例1”中有两个接口,在该接口中,我有具有不同返回类型的相同方法,并且在另一个接口中扩展了这两个接口,然后由于返回类型与继承的方法不兼容,我遇到了编译时错误,但是在这里当我们在第三个接口中扩展两个接口时,方法将被重载,而在方法重载中,方法的返回类型无效,那么这为什么会产生错误。

如果在“案例2”中具有相同返回类型的两个接口中使用相同的方法,并在第三个接口中扩展两个接口,那么在这里我不会出现任何错误。为什么?

案例1

Interface1.java

public interface I1
{
int m();
}

Interface2.java

public interface I2
{
void m();
}

Interface3.java

public interface I3 extends I1,I2
{

}

案例2

Interface1.java

public interface I1
{
int m();
}

Interface2.java

public interface I2
{
int m();
}

Interface3.java

public interface I3 extends I1,I2
{

}

1 个答案:

答案 0 :(得分:8)

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

您说“在方法重载中,方法的返回类型无效”-事实并非如此。在方法重载中,返回类型不是签名的一部分。您不能仅通过更改返回类型来重载方法,正是因为它们具有相同的签名,所以

class Foo
{
    public void m() {}
    public int m() { return 1; }
}

结果:

error: method m() is already defined in class Foo

在第二种情况下,界面是一致的。只需使用单个方法int m() { ... },就可以完全实现它。单个方法将用于实现I1.mI2.m的事实不是问题。