Java中的接口是否可以继承多个接口?

164

在Java中,接口是否可以扩展多个接口?这段代码在我的IDE中似乎是有效的,并且也编译通过:

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

但是我听说Java不允许多重继承。为什么看起来接口有例外呢?


3
哪些文章说这是不可能的?它们要么是错误的,要么是你误解了它们,它们谈论的是类而不是接口。 - user395760
7
此问题似乎不符合主题,因为它可以通过自行研究轻松得到答案。 - JoseK
4
如果他确实找到了相互矛盾的文章,他应该将它们发布出来。这样人们就知道不要阅读那些文章了。 - But I'm Not A Wrapper Class
12
这个问题的答案帮我节省了时间。我认为它作为一个有效问题具有价值。 - xdhmoore
7
有用的问题,我本来期望我的IDE会抛出一些警告,但惊讶地发现没有。所以我无意中在谷歌上输入了与原帖相同的问题,结果找到了这个页面并得到了一些答案/确认。 - Arthur
显示剩余4条评论
7个回答

211

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

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
19
如果你有一个名为 void test() 的接口 A 和一个名为 boolean test() 的接口 B,会发生什么?(这是“钻石问题”的近亲吗?)__我尝试了一下,明智的做法是:如果返回类型不同,则不允许。 - Daniel
@sureshatta - 那会发生什么?它会同时调用两个吗? - Fattie
7
Java中一个类不允许出现两个方法拥有相同的签名但返回类型不同。这个问题来源于StackOverflow:https://dev59.com/questions/_GQo5IYBdhLWcg3wUd-L - Ninh Pham

89

接口可以扩展多个接口

可以实现多个接口

然而,只能继承一个类

在谈论 interfaceclass 时,请注意如何使用单词 extendsimplements


21

从Oracle关于多重继承类型的文档页面,我们可以在这里找到准确的答案here。 在这里,我们首先应该了解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中继承了关联性不强的方法()的默认值, 你可以这样修复它: interface D extends B, C

interface D extends B, C {
                @Override
                default void method() {
                    B.super.method();
                }
            }
  1. 在Java中,多重继承是允许的,因为接口不包含可变字段,且只有一个实现将属于类,所以Java并不会出现任何问题,它允许你这样做。

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


2
我认为这是一个更合适的答案,对问题进行了更多的澄清。+1 - Ketan Joshi
谢谢@KetanJoshi,这让我更有动力继续前行 :) - shankar upadhyay
@危险,这里的重点不在于定义接口内的方法,很明显从Java 8开始我们就可以定义它了。希望我已经回答了你的问题。谢谢 Shankar - shankar upadhyay
嗨@shankarupadhyay,我只是想说,如果您正在定义接口,则不要将方法实现放在接口中,只需声明方法或使用类。作为开发人员,即使关注点在其他方面,我们也不应犯这些错误。 - Danger

11

Java中的接口是否可以扩展多个接口?

答案是:可以。

根据JLS所述:

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


JLS = "Java语言规范",在这些问题中是权威的来源。 - Hontvári Levente

4

您可以实现多个 接口,但无法继承多个

Java不支持多重继承的原因是C++中存在此问题,给人留下了糟糕的经验。

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


2

我认为你的困惑在于多重继承,在Java中这是不被允许的,而且这也是一个不好的实践。然而,在Java中实现多个接口是被允许的,也是安全的。


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接