关于Java中接口的查询

关于Java中接口的查询,java,interface,object-oriented-analysis,overriding,Java,Interface,Object Oriented Analysis,Overriding,假设我有两个接口接口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中的一个缺陷吗?我认为这是不允许我们扩展多个类的主要原因之一,那么,当这个问题仍然存在时,为什么允许我们实现多

假设我有两个接口接口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编程语言支持重载方法,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中,方法签名由名称和参数类型组成

定义:方法声明的两个组件组成 方法签名方法的名称和参数类型

为了重载方法,您需要有不同的签名

Java中的多重继承是不允许的,因为存在一些复杂的问题,例如定义当方法由两个或多个超类实现时应该发生的实现。对于这个话题,我建议大家看看


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

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

  • 您的“C类”实现接口“A”

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

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


  • 如果您真的需要在同一个类中同时使用这两个接口,这可能也会让您大吃一惊:)

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

    您能发布错误消息吗?您的意思是Inner类D实现了B吗?那么java如何处理多个接口中具有相同签名和相同返回时间的方法呢ink以便它将成功编译:)如果它是相同的签名、名称和返回类型,则无需执行任何操作,这两个接口在实现上都是满意的。这两个接口都已实现。@Spaeth:是的,但对于上述问题,这意味着他正在尝试多重继承?否,使用两个接口意味着您的类已实现Antion满足了两个契约,它没有继承性…多重继承是指当您扩展了多个类时(但随后您将遇到其他类型的问题,看看我的答案;)