Java - 接口实现中的方法名称冲突

如果我有两个接口,两者的用途完全不同,但使用相同的方法签名,我如何使一个类实现两者,而不必被迫编写一个用于两个接口的方法,并在方法实现中编写一些复杂的逻辑来检查正在对哪种类型的对象进行调用并调用正确的代码?

在C#中,这被所谓的显式接口实现所克服。在Java中是否有任何等效的方法?


答案 1

不,在Java中的一个类中,没有办法以两种不同的方式实现相同的方法。

这可能会导致许多令人困惑的情况,这就是为什么Java不允许它的原因。

interface ISomething {
    void doSomething();
}

interface ISomething2 {
    void doSomething();
}

class Impl implements ISomething, ISomething2 {
   void doSomething() {} // There can only be one implementation of this method.
}

您可以做的是从两个类组成一个类,每个类实现不同的接口。然后,该类将具有两个接口的行为。

class CompositeClass {
    ISomething class1;
    ISomething2 class2;
    void doSomething1(){class1.doSomething();}
    void doSomething2(){class2.doSomething();}
}

答案 2

在Java中没有真正的方法来解决这个问题。您可以使用内部类作为解决方法:

interface Alfa { void m(); }
interface Beta { void m(); }
class AlfaBeta implements Alfa {
    private int value;
    public void m() { ++value; } // Alfa.m()
    public Beta asBeta() {
        return new Beta(){
            public void m() { --value; } // Beta.m()
        };
    }
}

虽然它不允许从 到 的强制转换,但向下转换通常是邪恶的,如果可以预期一个实例通常也有一个方面,并且由于某种原因(通常优化是唯一有效的原因),您希望能够将其转换为 ,您可以在其中制作一个子接口。AlfaBetaBetaAlfaBetaBetaAlfaBeta asBeta()