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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (338)

我有两个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();
    }
}
提问于
用户回答回答于

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; } } getNumberOfScales类中的方法Tuna具有名称,签名和返回类型,它们与接口中声明的方法相匹配,并且与接口中Fish声明的方法相匹配Piano; 它被认为是同时实施。

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

用户回答回答于

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

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

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

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

当然在你的例子中,有两个接口声明相同的方法是一个坏主意。更实际的情况是,你应该用“play()”方法制作了一个界面“Player”,并且还有另外两个更具体的界面DVDPlayer和CassettePlayer(具有DVD和磁带的特定方法)从Player继承。另一方面,如果您不需要DVD或磁带的特定方法,那么您不需要两个不同的接口,只实现一个相同的方法 - 只需使用一个接口播放器即可。

扫码关注云+社区

领取腾讯云代金券