首页 > 解决方案 > 为什么案例 1 中的接口会引发编译时错误,但案例 2 中编译成功

问题描述

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

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

情况1

接口1.java

public interface I1
{
int m();
}

接口2.java

public interface I2
{
void m();
}

接口3.java

public interface I3 extends I1,I2
{

}

案例二

接口1.java

public interface I1
{
int m();
}

接口2.java

public interface I2
{
int m();
}

接口3.java

public interface I3 extends I1,I2
{

}

标签: javainterfaceoverloading

解决方案


在您的第一种情况下,界面不一致。任何类都不可能实现它,因为它不能满足“必须有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不是问题。


推荐阅读