17
interface A {

    public void doSomething();
}

interface B extends A {

    public void doSomethingElse();
}

public class AClass implements A, B {

    public void doSomething() {}

    public void doSomethingElse() {}

}

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

4

5 回答 5

6

我认为“为什么”的问题只能由 Java 设计人员来回答。

一个原因可能是它允许extends AB不破坏任何已经碰巧实现两者的现有类的情况下进行改造。

使用此构造的另一个原因可能是让最终用户立即清楚AClass该类同时实现了AB。这在 ArrayList.java 中 List 接口的冗余实现中进行了讨论

于 2013-01-23T16:06:11.877 回答
2

这只是一种方便。跟踪接口结构是什么可能很困难,并且程序员必须全部跟踪它会很繁重。此外,不允许冗余接口也没有好处:多次实现一个接口可能是不可避免的。例如:

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

在这种情况下,A 被“实现”了两次,但这没问题。它只是意味着必须实现在、和AClass中声明的每个方法。ABC

于 2013-01-23T16:04:54.437 回答
2

如果这是一个错误,那么向现有公共接口添加基本接口将是一个重大更改。
(如果客户端代码有一个已经实现了这两个接口的类)

于 2013-01-23T16:14:11.173 回答
1

1)为什么不实施 A 两次是多余的,但不会导致混乱。

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

于 2013-01-23T16:06:24.013 回答
0

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

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]
}

这可能不是以某种方式设计类的理由,但表明它确实在运行时产生了影响。

于 2021-01-06T22:07:19.353 回答