java - 为什么案例 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
{
}
解决方案
在您的第一种情况下,界面不一致。任何类都不可能实现它,因为它不能满足“必须有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
不是问题。
推荐阅读
- python - 如何在不使用循环的情况下重写 NumPy 代码
- javascript - 当我让它出现或消失内容时,CSS切换切换动画不起作用
- java - 在 Java 中使用泛型来避免代码重复
- r - 从 R Markdown(当 longtable 不可用时)使表格跨越 pdf 的多个页面?
- python - 解释这个列表合并的 oneliner 列表是如何工作的?
- python - 如何过滤python中有字符串值的值?
- jquery - 如何使用 CSS 使页面标题居中?
- azerothcore - 我可以配置 AzerothCore 以便只有两个人可以从头到尾(突袭)玩 WLK 吗?
- apache-spark - 将字符串的一部分转换为数据帧的不同列
- c# - 接收广播