在 Java 类中实现的具有相同方法签名的两个接口

我有两个Java接口和一个实现类。

(我使用Eclipse直接运行程序,我没有尝试通过从命令行显式编译来检查任何编译器警告等。

为什么它们可以毫无问题地运行?为什么Java允许这样做,即使它满足两个接口的“契约”,但在实现类时会产生歧义?

更新了示例。

public interface CassettePlayer {
    void play();
}

public interface DVDPlayer {
    void play();
}

public class CarPlayer implements CassettePlayer,DVDPlayer{

    @Override
    public void play() {
        System.out.println("This plays DVD, screw you Cassette !");
    }

    public static void main(String args[]) {
        CarPlayer cp = new CarPlayer();
        cp.play();

        CassettePlayer firstInterface = new CarPlayer();
        firstInterface.play();

        DVDPlayer secondInterface = new CarPlayer();
        secondInterface.play();
    }
}

答案 1

Java 语言规范第 8.1.5 节中特别允许此方案:

允许类中的单个方法声明实现多个超接口的方法。例如,在代码中:

interface Fish { int getNumberOfScales(); }
interface Piano { int getNumberOfScales(); }
class Tuna implements Fish, Piano {
   // You can tune a piano, but can you tuna fish?
   int getNumberOfScales() { return 91; }
}

类中的方法具有名称,签名和返回类型,该类型与接口中声明的方法匹配,并且还与接口中声明的方法匹配;它被认为是实现两者。getNumberOfScalesTunaFishPiano

然后,文本继续指出,如果方法签名具有不同的返回类型,例如 and ,则无法在同一类中实现两个接口,并且会产生编译时错误。doubleint


答案 2

对于此问题,有必要了解接口的用途。

接口是一种“契约”,以便知道在具有该接口的类中强制实现哪些方法。

因此,如果你需要一个实现“DVDPlayer”的类(因为你需要“play()”的方法),你会发现CarPlayer。对于实现CassettePlayer的类的需求也是如此。这是技术上的解释。

但是,当然,在你的语义编码中,你应该确保CarPlayer的方法“play()”同时满足DVDPlayer和CassettePlayer的语义。我认为在实际应用中,这将是一个不好的做法。

当然,在您的示例中,让两个接口声明相同的方法是一个坏主意。更实际地说,您应该使用方法“play()”创建一个界面“Player”,并具有另外两个更具体的界面DVDPlayer和CassettePlayer(具有DVD和盒式磁带的特定方法),它们继承自Player。另一方面,如果您不需要DVD或盒式磁带的特定方法,那么您不需要两个不同的接口,只需实现一个相同的方法 - 只需使用一个接口播放器,就足够了。