9

假设我有两个接口接口 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中的缺陷吗?我认为这是不允许我们扩展多个类的主要原因之一,那么当这个问题仍然存在时,为什么我们允许实现多个接口?

4

4 回答 4

7

Java 教程:定义方法 - 重载方法状态,

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!
于 2012-06-23T19:07:46.923 回答
4

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

于 2012-06-23T19:44:48.047 回答
2

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

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

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

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

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

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

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

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

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

于 2012-06-23T19:08:22.963 回答
0

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

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

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

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

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

于 2012-06-23T19:13:31.707 回答