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

Ank*_*ava 2 java overloading interface

我在"CASE 1"中有两个接口,其中我有相同的方法和不同的返回类型,我在另一个接口中扩展两个接口然后我得到编译时错误,因为返回类型与继承方法不兼容但是在这里我们是在第三个接口中扩展两个接口然后方法被重载并且在方法重载中返回类型的方法没有效果,那么为什么这会给出错误.

另外,如果我在"CASE 2"中具有相同返回类型的两个接口中的相同方法,并且在第三个接口中扩展两个接口,那么这里我没有得到任何错误.为什么?

情况1

Interface1.java

public interface I1
{
int m();
}
Run Code Online (Sandbox Code Playgroud)

Interface2.java

public interface I2
{
void m();
}
Run Code Online (Sandbox Code Playgroud)

Interface3.java

public interface I3 extends I1,I2
{

}
Run Code Online (Sandbox Code Playgroud)

案例2

Interface1.java

public interface I1
{
int m();
}
Run Code Online (Sandbox Code Playgroud)

Interface2.java

public interface I2
{
int m();
}
Run Code Online (Sandbox Code Playgroud)

Interface3.java

public interface I3 extends I1,I2
{

}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

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

你说"在方法重载返回类型的方法没有影响" - 这不是真的.在方法重载中,返回类型不是签名的一部分.您不能通过仅更改返回类型来重载方法,因为它们具有相同的签名:

class Foo
{
    public void m() {}
    public int m() { return 1; }
}
Run Code Online (Sandbox Code Playgroud)

结果:

error: method m() is already defined in class Foo
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,界面是一致的.只需一个方法就可以实现它int m() { ... }.事实上,单一方法将用于实现两者I1.m并且I2.m不是问题.