约书亚·布洛赫(Joshua Bloch)在《有效的Java》中提到重载时说:
如果始终清楚哪个重载将应用于任何给定的一组实际参数,则导出具有相同数量的参数的多个重载就不会使程序员感到困惑。当每对重载中的至少一个对应的形式参数在两个重载中具有“根本不同”的类型时,就是这种情况。如果显然不可能将任何非null表达式强制转换为两种类型,则两种类型根本不同。
但是,接着说:
除Object以外的其他数组类型和类类型完全不同。而且,除了Serializable和Cloneable之外的其他数组类型和接口类型也有根本不同。
我的问题是,尽管Java允许多个接口实现,但为什么接口类型被认为是根本不同的呢?
例如,假设我有Foo
实现interface 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的原因是数组类型实现了这两个接口。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句