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

Rak*_*ela 16 java compiler-construction interface multiple-inheritance

我有两个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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*oni 38

这种情况在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; }
}
Run Code Online (Sandbox Code Playgroud)

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

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


Jan*_*ana 5

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

接口是一种"契约",因此人们知道在具有该接口的类中强制实现哪些方法.

因此,如果您需要一个实现"DVDPlayer"的类(因为您需要方法"play()"),您将找到CarPlayer.同样需要一个实现CassettePlayer的Class.这是技术解释.

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

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