在Java中,接口是否可以扩展多个接口?这段代码在我的IDE中似乎是有效的,并且也编译通过:
interface Foo extends Runnable, Set, Comparator<String> { }
但是我听说Java不允许多重继承。为什么看起来接口有例外呢?
在Java中,接口是否可以扩展多个接口?这段代码在我的IDE中似乎是有效的,并且也编译通过:
interface Foo extends Runnable, Set, Comparator<String> { }
但是我听说Java不允许多重继承。为什么看起来接口有例外呢?
是的,你可以做到。一个接口可以扩展多个接口,如下所示:
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
void test()
的接口 A 和一个名为 boolean test()
的接口 B,会发生什么?(这是“钻石问题”的近亲吗?)__我尝试了一下,明智的做法是:如果返回类型不同,则不允许。 - Daniel接口可以扩展多个接口。
类可以实现多个接口。
然而,类只能继承一个类。
在谈论 interface
和 class
时,请注意如何使用单词 extends
和 implements
。
从Oracle关于多重继承类型的文档页面,我们可以在这里找到准确的答案here。 在这里,我们首先应该了解Java中的多重继承类型:
Java“不支持状态的多重继承,但自Java 8发布以来,它支持默认方法的实现多重继承和使用接口的类型多重继承。
然后在这里产生了“菱形问题”的问题,以及Java如何处理相关问题:
在实现的多重继承情况下,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();
}
}
总之,我们可以说Java不支持状态的多重继承,但它支持实现的多重继承和类型的多重继承。
Java中的接口是否可以扩展多个接口?
答案是:可以。
根据JLS所述:
一个接口可以声明为直接扩展一个或多个其他接口,这意味着它隐含地指定了所有成员类型、抽象方法和常量的接口扩展,除了它可能隐藏的任何成员类型和常量。
您可以实现多个 接口
,但无法继承多个 类
。
Java不支持多重继承的原因是C++中存在此问题,给人留下了糟糕的经验。
替代多重继承的方法是:一个类可以实现多个接口(或者一个接口可以扩展多个接口)。
我认为你的困惑在于多重继承,在Java中这是不被允许的,而且这也是一个不好的实践。然而,在Java中实现多个接口是被允许的,也是安全的。