接口可以在Java中扩展多个接口吗?

Pra*_*eek 119 java inheritance extends multiple-inheritance

接口可以在Java中扩展多个接口吗?此代码在我的IDE中显示有效,并且它确实编译:

interface Foo extends Runnable, Set, Comparator<String> { }
Run Code Online (Sandbox Code Playgroud)

但我听说Java中不允许多重继承.为什么接口似乎有例外?

Sur*_*tta 163

是的,你可以做到.接口可以扩展多个接口,如下所示:

interface Maininterface extends inter1, inter2, inter3 {  
  // methods
}
Run Code Online (Sandbox Code Playgroud)

单个类也可以实现多个接口.如果两个接口有一个定义相同名称和签名的方法怎么办?

有一个棘手的问题:

interface A {
    void test();
}

interface B {
    void test();
}

class C implements A, B {

    @Override
    public void test() {

    }     

}
Run Code Online (Sandbox Code Playgroud)

然后单个实现适用于两个:).

在这里阅读我的完整帖子:

http://codeinventions.blogspot.com/2014/07/can-interface-extend-multiple.html

  • 如果你有一个带有`void test()`的接口A和带有`boolean test()`的接口B怎么办?(这是[钻石问题]的表兄(https://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem)吗?)_ _审查它并且发生了明智的事情:如果返回类型不同,则不允许. (12认同)
  • 一个类不允许2个方法具有不同的返回类型的相同签名.http://stackoverflow.com/questions/16149285/does-a-methods-signature-in-java-include-its-return-type (4认同)

But*_*ass 72

接口可以扩展多个接口.

一个可以实现多个接口.

但是,一个只能扩展一个类.

小心你如何使用这些词语extendsimplements谈论interfaceclass.


Mas*_*dul 8

接口可以扩展java中的多个接口吗?

答案是:是的.

根据JLS

接口可以被声明为一个或多个其他接口的直接扩展,这意味着它隐式指定它扩展的接口的所有成员类型,抽象方法和常量,除了它可能隐藏的任何成员类型和常量.


sha*_*yay 5

从关于多重继承类型的Oracle文档页面中,我们可以在此处找到准确的答案。在这里,我们首先应该知道Java中的多重继承的类型:

  1. 状态的多重继承。
  2. 实现的多重继承。
  3. 类型的多重继承。

Java“不支持状态的多重继承,但自Java 8发布以来,它支持使用默认方法实现的多重继承和带有接口的类型的多重继承。

然后,这里出现了“钻石问题”以及Java如何处理该问题的问题:

  1. 在实现的多重继承的情况下,Java编译器会给出编译错误,并要求用户通过指定接口名称对其进行修复。这里的例子:

                interface A {
                    void method();
                }
    
                interface B extends A {
                    @Override
                    default void method() {
                        System.out.println("B");
                    }
                }
    
                interface C extends A { 
                    @Override
                    default void method() {
                        System.out.println("C");
                    }
                }
    
                interface D extends B, C {
    
                }
    
    Run Code Online (Sandbox Code Playgroud)

因此,在这里我们将得到错误,因为:-接口D从类型B和C继承了method()的不相关默认值接口D扩展了B,C

您可以像这样修复它:

interface D extends B, C {
                @Override
                default void method() {
                    B.super.method();
                }
            }
Run Code Online (Sandbox Code Playgroud)
  1. 在类型的多重继承中,java允许这样做,因为接口不包含可变字段,并且该类仅属于一个实现,因此java不会产生任何问题,并且您可以这样做。

结束语我们可以说Java 不支持 状态的多重继承,但是它确实支持 实现的多重继承和类型的多重继承

  • 我认为这是一个更合适的答案,并且更澄清了问题。+1 (2认同)