Java 在类中同时实现超级接口和子接口(类a实现超级接口、子接口)

Java 在类中同时实现超级接口和子接口(类a实现超级接口、子接口),java,interface,Java,Interface,为什么Java允许这样的声明?当通过实现子接口(B)可以实现相同的事情时,实现两个接口有什么用 这只是一种方便。跟踪接口结构是很困难的,而且程序员必须跟踪所有接口结构,这将是一项繁重的工作。此外,不允许冗余接口也不会带来任何好处:多次实现接口可能是不可避免的。例如: interface A { public void doSomething(); } interface B extends A { public void doSomethingElse(); } publ

为什么Java允许这样的声明?当通过实现子接口(B)可以实现相同的事情时,实现两个接口有什么用

这只是一种方便。跟踪接口结构是很困难的,而且程序员必须跟踪所有接口结构,这将是一项繁重的工作。此外,不允许冗余接口也不会带来任何好处:多次实现接口可能是不可避免的。例如:

interface A {

    public void doSomething();
}

interface B extends A {

    public void doSomethingElse();
}

public class AClass implements A, B {

    public void doSomething() {}

    public void doSomethingElse() {}

}
在本例中,A被“实现”两次,但这没有问题。这仅仅意味着
AClass
必须实现
A
B
C
中声明的每个方法。我认为“为什么”这个问题只能由Java设计师来回答

一个原因可能是,它允许对
进行改装,将A
扩展到
B
,而不破坏已经实现了这两个类的任何现有类

使用此构造的另一个原因可能是为了让
AClass
的最终用户立即清楚地知道,该类同时实现了
A
B
。这在

1)中进行了讨论。为什么不实施两次测试是多余的,但不会导致混淆

2) 接口
B
可能会更改(并且可能不再扩展
A
)。
AClass
仍将实现
A
B

如果这是一个错误,向现有公共接口添加基本接口将是一个突破性的改变。

(如果客户端代码有一个类已经实现了这两个接口)

冗余继承声明对某些反射调用有影响

interface A { ... }
interface B extends A { ... }
interface C extends A { ... }
public class AClass implements B, C { ... }

这可能不是以某种方式设计类的原因,但表明它在运行时确实有影响。

不允许它会有什么好处?可能会重复
interface One {}
interface Two extends One {}
static class Three implements Two {}
static class Four implements One, Two {}

public static void main(String... args) {
    Three three = new Three();
    Four four = new Four();
    System.out.println(Arrays.toString(three.getClass().getInterfaces()));  // [Two]
    System.out.println(Arrays.toString(four.getClass().getInterfaces()));  // [One, Two]
}