当前位置: 首页 > 面试题库 >

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

温智明
2023-03-14
问题内容

我有两个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的名称,签名和返回类型与interface中声明的方法匹配,Fish并且还与interface中声明的方法匹配Piano;它被认为同时实现。

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



 类似资料:
  • 问题内容: 假设我有两个接口: 如果我想同时实现它们,那么将使用哪种实现? 问题答案: 这是一个编译时错误。您不能从两个接口获得两个实现。 但是,如果在中实现该方法,则是正确的: 我只想补充一点,即使I1中的方法是抽象的,而I2中的方法是默认的,您也无法实现它们两者。因此,这也是一个编译时错误:

  • 我有一个采访问题-C#,是否可以在一个类中实现,从接口继承有两个具有相同名称和相同签名的方法?

  • 问题内容: 假设我必须实现在两个不同的包中声明的两个不同的接口(在两个不同的独立项目中)。 我有包装 并包装 在我的包里 如何处理这种情况? 问题答案: 正如常见问题解答所提到的 其他语言的经验告诉我们,使用具有相同名称但签名不同的多种方法有时会很有用,但在实践中也可能会造成混淆和脆弱。 在Go的类型系统中,仅按名称进行匹配并要求类型一致是简化的主要决定 。 在您的情况下,您将满足两个接口。 您可

  • 我有以下场景: 以下是我的问题: 如果中的静态方法是公共的,则编译错误将为: 静态方法m1()与I中的抽象方法冲突。 因此,当访问修饰符是默认值时,它试图隐藏,而当它是公共的时,它是冲突的。为什么会有这样的区别呢?背后的理念是什么?

  • 假设您有2个包,并且有名为-Test的公共类。 第一个包。测试 第二包测试 它们中的每一个都有实例变量-x。 在第一种情况下-int x=2; 在第二种情况下-int x=3; 我想导入FirstPackage。在第二个包内测试。测试并打印值为2的x。 我的代码: 但是输出是3。如何打印?

  • 在JLS 8第8.4.8.1节中,有一条声明: 在某些参数化下,泛型超类C中的具体方法可以与该类中的抽象方法具有相同的签名。在这种情况下,具体方法是继承的,而抽象方法不是。然后应将继承的方法视为覆盖其来自C的抽象对等体。 有人能为泛型类提供这种参数化的例子吗?我不能。