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节中特别允许:
允许类中的单个方法声明实现多个超接口的方法.例如,在代码中:
Run Code Online (Sandbox Code Playgroud)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; 它被认为是实现两者.
然后,文本继续注意,如果方法签名具有不同的返回类型,例如double和int,则无法在同一个类中实现这两个接口,并且将产生编译时错误.
对于这个问题,有必要了解接口的用途.
接口是一种"契约",因此人们知道在具有该接口的类中强制实现哪些方法.
因此,如果您需要一个实现"DVDPlayer"的类(因为您需要方法"play()"),您将找到CarPlayer.同样需要一个实现CassettePlayer的Class.这是技术解释.
但是当然在你的语义编码中你应该确保CarPlayer的方法"play()"满足DVDPlayer和CassettePlayer的语义.我认为在实际应用中这将是一个不好的做法.
当然在你的例子中,有两个接口声明相同的方法是一个坏主意.更实际的是,您应该使用方法"play()"创建一个"Player"接口,并且还有另外两个更具体的接口DVDPlayer和CassettePlayer(具有DVD和磁带的特定方法),它们继承自Player.另外,如果你不需要DVD或磁带的特定方法,那么你不需要两个不同的接口只实现一个相同的方法 - 只需使用一个接口播放器,这就足够了.
| 归档时间: |
|
| 查看次数: |
18346 次 |
| 最近记录: |