作者:南阳啸68 | 来源:互联网 | 2022-12-01 13:27
我在"CASE 1"中有两个接口,其中我有相同的方法和不同的返回类型,我在另一个接口中扩展两个接口然后我得到编译时错误,因为返回类型与继承方法不兼容但是在这里我们是在第三个接口中扩展两个接口然后方法被重载并且在方法重载中返回类型的方法没有效果,那么为什么这会给出错误.
另外,如果我在"CASE 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
{
}
Jon Skeet..
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.m
并且I2.m
不是问题.
1> Jon Skeet..:
在第一种情况下,界面不一致.任何类都不可能实现它,因为它不能满足"必须有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.m
并且I2.m
不是问题.