多个重载合法时调用哪种方法?

时间:2011-02-22 12:30:48

标签: java interface parameters multiple-inheritance

假设您有一个接口A和一个接口B。假设Sprite类实现了两个接口。

假设另一个类有一个方法foo(A object),并且还有一个方法foo(B object)

当我将Sprite的实例传递给方法foo()时,是否会调用它们?如果没有,哪个优先?

4 个答案:

答案 0 :(得分:8)

使用方法重载(就像在这里使用的那样),调用的方法在编译时根据保存Sprite的变量的(声明的)类型来解析。 / p>

由于方法调用不明确,因此在手动向下转换引用以解决歧义之前,这将无法编译。

答案 1 :(得分:4)

这是模棱两可的。您需要转换为其中一个接口。

答案 2 :(得分:3)

   interface A {}

   interface B {}

   class Sprite implements A,B {}

   class Test{
      void foo(A a){}
      void foo(B b){}

      void test(){
       Sprite s = new Sprite();
       foo(s); // <-- compile time error (The method foo(A) is ambiguous for the type Test)
      }
   }

答案 3 :(得分:0)

一般答案需要几页解释;见the relevant section in the language specification

在您呈现的特定情况下,它不会编译。但在其他情况下,有一些规则可以使编译器更喜欢一个重载到另一个并解决冲突。

最重要的规则是,一般来说,如果一种方法比其他方法更具体,则选择该方法。如果方法A的所有可能的调用在调用方法B时也会编译,则方法A 比方法B更具体。这通常意味着方法A的某些形式参数是从相应的子类中创建的。方法B中的形式参数。在少数情况下,这将不适用,例如当需要自动装箱或其他“方法转换”以使参数适合“否则更具体”的情况时。有关细节,请参阅规范。