2012-08-23 81 views
4

我有一种行为,我不明白在Java中重载。使用Java中的接口重载方法

这里是我的代码:

interface I {} 

class A implements I {} 

class B { 
    public void test(I i) {} 

    public void test (A a) {} 
} 

当我调用下面一行:

I a = new A(); 
b.test(a); 

我想调用的方法是test(A)但明显这是test(I)

我不明白为什么。在运行时我的变量a是甲甚至A继承I.

+0

http://en.wikipedia.org/wiki/Multiple_dispatch –

+0

因为这个决定是在编译时完成的 - 并且在编译时没有办法知道'a'是否是'A'或其他东西(例如它可能取决于用户输入)。可以肯定的是'a'将会是'I'。 – assylias

回答

6

由于参考类型是我虽然你们有类型A.

甲一个新= A()的对象;

将调用方法test (A a) {}

作为每JLS第15章:

被选择在编译时最特异的方法;其描述符 确定在运行时实际执行的方法。

+0

我不能那样做,否则我会这样做。我已经减少了代码,但是我从另一种方法中获得了我的a,并且我无法更改它。 – Kiva

+1

你是一个叫b.test(a)的人;不是吗?那么为什么不把“a”的引用从I改为A? – kosa

+0

我不知道运行时的“a”类型。我的方法给我一个我和我打电话的另一种方法。我想为某些类做一些具体的事情,我不想做“如果instanceof {做那个} else if instanceof {做其他事情}”,所以我很糟糕,我可以通过重载来做到这一点。 – Kiva

3

变量aI类型的 - 如果你使用A a = new A();它会使用正确的重载方法。

0

考虑以下情形:

interface Animal { } 

    class Dog implements Animal{ public void dogMethod() {} } 

    class Cat implements Animal{ public void catMethod() {} } 

    public class Test { 
     public static void test (Animal a) { System.out.println("Animal"); } 

     public static void test (Dog d) { System.out.println("Dog"); } 

     public static void test (Cat c) { System.out.println("Cat"); } 

     public static void main(String[] args) { 
      Animal a = new Cat(); 
      Animal d = new Dog(); 

      test(a); 
     } 
    } 

若(a)印有“猫”,而不是(正确),“动物”,只是因为它拥有一只猫对象的引用,那么你就能够调用测试catMethod()在Animal对象上,这没有任何意义。 Java根据类型选择最适用的方法,而不是变量引用的方法。