2011-12-02 52 views
2

只是为了好奇,我尝试这样做:具有相同名称的继承方法,它是如何工作的?

public interface test1 { 
    public Object method1(String str); 
} 

public interface test2 { 
    public Object method1(String str); 
} 

public class Test implements test1, test2 {  
    public static void main(String... args) { 

    } 

    public Object method1(String str) { 
     return new Object(); 
    } 
} 

我从Eclipse的期待某种错误的在线public class Test implements test1, test2 {,却没有一个。

  1. 为什么没有编译时错误,因为有方法名称的冲突 ?
  2. class Test中继承了多少种方法?
  3. 如果上述问题的答案是2,那么究竟我们实现了哪种方法 ?
  4. 而在运行时,如何正确实施的方法是 被选中?而不是另一个?
  5. 最后,有没有一种方法来实现两者? (我几乎可以肯定,答案是否定的)

我知道从设计的角度来看,这可能不会发生在现实世界的情况下,但正如我刚才提到的,它刚刚来到我的思想和我试了一下。

任何澄清/参考非常感谢。

+2

有什么问题?这两个接口都承诺任何实现它们的类都有一个方法'method1(String)',你的'Test'类实现了这个承诺。 –

+1

如果你有interface1 {public int method1(String var); }和interface2 {public String method1(String var); }。那么你会得到一个错误,因为没有执行其中的一个(你无法解决这个问题。) –

+0

@Angelo Neuschitzer:但在那种情况下根本就没有碰撞 – Bhushan

回答

7

没有碰撞。这两个接口都需要一个名为method1的方法,并且都在您的示例类中的method1满足。当你实现一个接口时,你根本不会继承任何方法;你只能保证自己实施这些方法。

为了回答你的最后一个问题,看到这个现有的SO问题:

Java - Method name collision in interface implementation

有面向Java 8的提案,允许接口指定一个默认的实现,称为Virtual Extension Methods。如果这使得它成为语言,两个接口就可能为同一方法签名指定不同的默认实现。如果这些接口然后由一个类实现,那么它将不得不提供它自己的实现(即,它将等于既没有指定缺省值的接口) - 参见3.3。相冲突的默认值

0

您的接口在方法中没有任何实现,并且它们的签名是相同的。因此,该方法实际上只有一个版本,并且这是Test类中的实现。

所以实际上并没有任何名称冲突。

+0

你不能在接口中添加实现 – hage

+0

我们如何在接口中添加实现细节? – Bhushan

+0

这是我的答案中的一个错误 - 我把它拿出来了。 – jefflunt

0

a)即使在接口中有方法名称的碰撞。实现接口的类需要实现接口的所有方法。在这种情况下,因为你的类满足了实现接口的所有条件,所以它不会产生任何错误。

该类实现了接口Test1以及Test2的所有方法,并且尽管方法名称碰撞,实现的编码满足所以它不会产生错误。b)当你实现接口时没有什么可以继承,所有你需要做的就是在你的类中实现接口的所有方法,否则它必须声明为抽象类。

相关问题