java - 为什么接口类型被认为与重载完全不同?
问题描述
在 Joshua Bloch 的 Effective Java 中,它提到重载时说:
如果始终清楚哪种重载将应用于任何给定的实际参数集,则导出具有相同数量参数的多个重载不太可能使程序员感到困惑。当每对重载中至少有一个对应的形式参数在两个重载中具有“完全不同”的类型时,就会出现这种情况。如果显然不可能将任何非空表达式转换为两种类型,则两种类型是完全不同的。
然而,它接着说:
数组类型和 Object 以外的类类型完全不同。此外,除了 Serializable 和 Cloneable 之外的数组类型和接口类型也完全不同。
我的问题是,尽管 Java 允许多个接口实现,为什么接口类型被认为是完全不同的?
例如,假设我有Foo
实现接口的类Barable
和Bazable
. 如果我有一对重载方法,一个接受Barable
作为参数,另一个接受Bazable
,那为什么不模棱两可?例如,由于重载不明确,以下内容将无法编译:
interface Bazable {
public void baz();
}
interface Barable {
public void bar();
}
class Foo implements Barable, Bazable {
public Foo() {
}
public void baz() {
System.out.println("Can baz");
}
public void bar(){
System.out.println("Can bar");
}
}
class Main {
public static void main(String[] args) {
Foo f = new Foo();
test(f);
}
public static void test(Barable t) {
System.out.println("Using barable overload");
}
public static void test(Bazable t) {
System.out.println("Using bazable overload");
}
}
解决方案
这句话的意思,
除了 Serializable 和 Cloneable 之外的数组类型和接口类型是完全不同的。
...是接口类型与数组类型完全不同,而不是接口类型彼此完全不同。排除 Serializable 和 Cloneable 的原因是数组类型实现了这两个接口。
推荐阅读
- flutter - 从子组件访问值和函数
- angular - Angular 8 href 重定向
- php - 获取组织名称并将其缩写,其变体中省略了“of”和“and”,但也包含在其他变体中
- javascript - moduleDirectories 键无法导入我的测试工具
- python - 当你重塑它时,numpy 数组的 getrefcount 发生了什么
- ionic4 - cdvphotolibrary:在 IONIC 4 上显示
- javascript - 如何在highcharts的渲染图像上添加工具提示?
- python-3.x - 如何将 cPanel WGSI 绑定到单独的 aiohttp 服务器
- c# - 如何将文本块的文本属性与文件名绑定
- python - 如何修复 Pandas 数据框 Python 中 str.replace 和 str.split 中的 SettingWithCopyWarnings?