首页 > 解决方案 > 为什么接口类型被认为与重载完全不同?

问题描述

在 Joshua Bloch 的 Effective Java 中,它提到重载时说:

如果始终清楚哪种重载将应用于任何给定的实际参数集,则导出具有相同数量参数的多个重载不太可能使程序员感到困惑。当每对重载中至少有一个对应的形式参数在两个重载中具有“完全不同”的类型时,就会出现这种情况。如果显然不可能将任何非空表达式转换为两种类型,则两种类型是完全不同的。

然而,它接着说:

数组类型和 Object 以外的类类型完全不同。此外,除了 Serializable 和 Cloneable 之外的数组类型和接口类型也完全不同。

我的问题是,尽管 Java 允许多个接口实现,为什么接口类型被认为是完全不同的?

例如,假设我有Foo实现接口的类BarableBazable. 如果我有一对重载方法,一个接受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");
  }
  
}

标签: javaooppolymorphism

解决方案


这句话的意思,

除了 Serializable 和 Cloneable 之外的数组类型和接口类型是完全不同的。

...是接口类型与数组类型完全不同,而不是接口类型彼此完全不同。排除 Serializable 和 Cloneable 的原因是数组类型实现了这两个接口。


推荐阅读