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


126

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

interface Foo extends Runnable, Set, Comparator<String> { }

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


3
哪些文章说不可能?他们错了,或者您误解了他们,他们在谈论类而不是接口。

7
这个问题似乎没什么意思,因为它可以很容易地通过自我研究回答
JoseK

4
@StephenC如果他确实发现有矛盾的文章,则应发布。这样,人们知道不阅读那些文章……
但是我不是包装工班

10
这个问题的答案为我节省了时间。我认为它具有作为有效问题的价值。
xdhmoore

6
有用的问题,我这样做是希望我的IDE发出一些警告,但没有看到任何警告。因此,我在不知不觉中在Google中输入了与操作符相同的问题,这使我进入了该页面并给出了一些答案/确认
Arthur

Answers:


170

是的,您可以做到。一个接口可以扩展多个接口,如下所示:

interface Maininterface extends inter1, inter2, inter3 {  
  // methods
}

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

有一个棘手的问题:

interface A {
    void test();
}

interface B {
    void test();
}

class C implements A, B {

    @Override
    public void test() {

    }     

}

然后,单个实现对这两个都有效:)。

在这里阅读我的完整文章:

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


@RahulBhadana抽象方法应该重写对吗?
Suresh Atta 2014年

13
如果您拥有A void test()接口和B接口boolean test()呢?(这是钻石问题的表亲吗?)__尝试并发生了明智的事情:如果返回类型不同,则不允许。
丹尼尔(Daniel)

@sureshatta-那么会发生什么?它同时调用
Fattie

4
一个类不允许2个方法使用不同的返回类型进行相同的签名。stackoverflow.com/questions/16149285/...
宁范

73

一个接口可以扩展多个接口

一个可以实现多个接口

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

小心您如何使用这些单词extends以及implements谈论interfaceclass


8

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

答案是:是的。

根据JLS

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


JLS =“ Java语言规范”,是这些问题的权威资料。
Hontvári利文特

6

从关于多重继承类型的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 {
    
                }

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

您可以像这样修复它:

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

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


1
我认为这是一个更合适的答案,并且可以对该问题进行更多的说明。+1
Ketan Joshi

谢谢@KetanJoshi这激励了人们继续
前进

4

您可以扩展多个,Interfaces但不能扩展多个classes

在Java中无法扩展多个类的原因是C ++在可能的情况下的不良经验。

多重继承的替代方法是,一个类可以实现多个接口(或者一个接口可以扩展多个接口)


2

我认为您的困惑在于多重继承,这是不好的做法,在Java中这也是不可能的。但是,在Java中允许实现多个接口,这也是安全的。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.