java

时间:2017-08-18 14:40:17

标签: java

旧问题:

我已经在某个地方读过在同一个类中实现两个具有相似方法签名的接口,这不是一个好的选择,可能会导致问题。像承保这样的琐碎程序很好。那么,出现什么样的问题?是未定义的行为还是导致设计问题?我无法得到它。从语言规范中得到的东西会有所帮助。

/* ------------------ */
public interface IA {

    public void method();
}
public interface IB {

    public void method();
}
/* ------------------ */
public class C implements IA, IB
{

    @Override
    public void method() 
    {
        System.out.println("class implementing two interfaces");
    }
    public static void main(String args[])
    {
        new C().method();
    }
}

修改

我知道钻石问题,如果我没有错,那么Java会避免它。我的观点不同了。因此,作为编辑,我将我的问题改为:,因为,"实现具有类似方法签名的两个接口"在同一个类中,在java中是完全有效的,那么为什么它被认为是一个糟糕的选择呢?从设计的角度来看,以及在这种实践中可能存在的任何其他问题。

3 个答案:

答案 0 :(得分:1)

我认为这里的主要问题是设计问题。对于不同的接口,相同的方法名称可能具有不同的语义。例如,如果您实现接口RunnablePlayer并且两者都有run方法,那么实现应该是什么样的? Runnable#run是运行代码段的通用方法,而Player#run可能是为了提高玩家的移动速度。

答案 1 :(得分:0)

这是一个经典的编程问题,最初是用C ++引入的。它被称为"钻石图案的继承"

Java通过让Interfaces只要求存在该方法来避免菱形图继承问题,但是接口的名称不是实现位置的维护因素。相反,总是使用Type树中最底层的实现。

所以,你可以有十几个接口全部声明run(),但无论你使用哪一个,它们都会调用run()的基类定义。

现在,更新Java语言的#34;默认方法"在一个接口中,它变得有点复杂,但允许这个的核心原因可以追溯到"默认方法"在接口上是允许的。

答案 2 :(得分:0)

技术上相同的签名应该没问题,就像你的例子一样。但类似的签名,即不同的返回类型可能会导致编译错误,如下所述: Implementing two interfaces in a class with same method. Which interface method is overridden?