【问题标题】:query about interfaces in Java查询Java中的接口
【发布时间】:2012-06-23 19:02:31
【问题描述】:

假设我有两个接口接口 A 和接口 B:

public interface A {
  public int data();
}

public interface B {
  public char data();
}

接口A有一个方法public int data(),接口B有一个方法public char data()

当我在某个 C 类中同时实现接口 A 和 B 时,编译器会给我一个错误。这是java中的缺陷吗?我认为这是不允许我们扩展多个类的主要原因之一,那么当这个问题仍然存在时,为什么允许我们实现多个接口?

【问题讨论】:

  • 能否请您发布错误消息?

标签: java interface object-oriented-analysis overriding


【解决方案1】:

The Java Tutorials: Defining Methods - Overloading Methods 州,

Java 编程语言支持重载方法,而 Java 可以区分具有不同方法签名的方法。这 意味着类中的方法可以具有相同的名称,如果它们有 不同的参数列表。

还有,

您不能声明多个具有相同名称的方法并且 相同数量和类型的参数,因为编译器无法分辨 他们分开。

编译器在微分时不考虑返回类型 方法,因此您不能声明具有相同签名的两个方法 即使它们具有不同的返回类型。

这两个实现的方法共享一个共同的方法签名(即data()),因此,编译器无法区分这两者,并将让该单一方法满足两个接口协定。


编辑:

例如,

public class Foo implements IFoo, IBar{

    public static void main(String[] args) {
        Foo foo = new Foo();
        ((IFoo) foo).print();
        ((IBar) foo).print();
    }

    @Override
    public void print() {
        System.out.println("Hello, World!");
    }
}

public interface IBar {
    void print();
}

public interface IFoo {
    void print();
}

哪个会输出,

Hello, World! 
Hello, World!

【讨论】:

  • 那么对于多个接口中签名相同、返回时间相同的方法,java是如何处理的呢?
  • 我认为它会编译成功:)
  • 如果是相同的签名,相同的名称和相同的返回类型,则无需做任何事情,两个接口都满足实现。两个接口都实现了。
  • @Spaeth:是的,但对于上述问题,这意味着他正在尝试多重继承?
  • 不,使用两个接口意味着你的类实现满足两个契约,它没有继承...多重继承是当你扩展了多个class(但是你会有其他类型的问题,看看我的回答;))
【解决方案2】:

Java 编译器(我认为也是 C#)不会通过返回值来区分方法。在您的情况下,编译器认为这两种方法相同,尽管返回类型不同

【讨论】:

    【解决方案3】:

    您提出的问题与多重继承无关。实现多个接口的类实现也不是。

    当你定义一个接口时,你只是说这个接口的实现者应该同意一个契约并实现该接口上定义的所有方法。

    一个类实现可以毫无问题地实现多个接口,但接口不能冲突。在您的情况中,您正在尝试实现两个接口来声明具有相同签名的方法

    方法签名由java中的名称和参数类型组成。

    定义:方法声明的两个组成部分包括 方法签名——方法的名称和参数类型。

    http://docs.oracle.com/javase/tutorial/java/javaOO/methods.html

    为了重载一个方法,你需要有不同的签名。

    Java 中不允许多重继承,因为当方法由两个或多个超类实现时,存在复杂的问题,例如定义应该执行哪个实现。对于这个主题,我建议查看Diamond Problem

    事实上,接口在某些情况下被用来模拟多重继承,允许类呈现一组合并的方法。

    【讨论】:

      【解决方案4】:

      一种解决方案是使用内部类:

      1. 您的“C 类”实现接口“A”

      2. 你还有一个实现接口“C”的内部类“D”:

        公共类 C 实现 A { ... 私有类 D 实现 B {

      如果你真的需要同一个类中的两个接口,这可能会让你吃蛋糕,吃它,太:)

      【讨论】:

      • 你的意思是内部D类实现B吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      • 1970-01-01
      • 2017-06-09
      • 2019-04-19
      • 2012-07-13
      • 2013-01-29
      相关资源
      最近更新 更多