【问题标题】:Why Java anonymous classes couldn't implement more than one interface? [duplicate]为什么 Java 匿名类不能实现多个接口? [复制]
【发布时间】:2011-11-24 09:19:53
【问题描述】:

可能重复:
WHY an Anonymous class in Java can't implement multiple interfaces directly? Simply because of syntax or there is another reason?

大家好,我想知道为什么 Java 匿名类不能实现多个接口?

如果 Java 设计者允许匿名类实现多个接口,我们会遇到什么问题?

这样:

IMammal, I4legged anonymous_creature = new IMammal, I4legged() {
    {
        //..
    }
};
anonymous_creature.FourLeggedStuff();
anonymous_creature.MammalStuff();

【问题讨论】:

  • @CodeBrickie 这是我的线程的副本;)

标签: java


【解决方案1】:

如果 Java 设计者允许匿名类实现多个接口,我们会遇到什么问题?

在 Java 类型系统中,每个表达式都有一个静态类型。如果您必须为 anonymous_creature 选择 一个 静态类型,您将无法充分利用该变量,这可能就是您编写的原因

IMammal, I4legged anonymous_creature =
^^^^^^^^^^^^^^^^^

这实际上从根本上改变了 Java 的类型系统。 (可能出于与多重继承相同的原因,即为了保持语言简单,将其排除在外。)

此外,还有一个简单的解决方法,那就是引入一个扩展它们的辅助接口:

interface FourLeggedMammal extends IMammal, I4Legged {
}

然后做

... new FourLeggedMammal() { ... }

【讨论】:

  • 我猜会发生“Ambigious method call”编译时错误。
  • OP 给出的例子可能是真的,但为什么不允许Mammal c = new Mammal() implements I4Legged { //I4Leged implementations... }。我不止一次需要这个,并且不得不采用简单的解决方法
  • @XaviLópez,但那有什么用呢? c 无论如何都不能用作 I4Legged,对吧?
  • 为什么不呢?它可能只是一个标记界面。也许我想实现一个Restricted 标记接口,以便将UI 组件标记为受限。我需要做类似的事情,不记得是接口还是注释。
  • @aioobe 我认为他的意思是I4Leg c = new Mammal() 实现了 I4Leg {..` 在这种情况下它可以用作I4Leg
【解决方案2】:

您可以通过abstract 类:

public abstract class AFourLeggedMammal implements IMammal, I4legged {
}

然后在你的代码中,你可以这样做:

AFourLeggedMammal dog = new AFourLeggedMammal() {

}

dog.FourLeggedStuff();
dog.MammalStuff();

【讨论】:

  • ...显然。但它不再是一个匿名类,所以这有点不同。
  • 嗯,你只是用一个界面把你的答案改成了同一个东西。最后的类也是anonymous,因为dog的类的名称是编译器生成的。这就是anonymous 的全部含义。
【解决方案3】:

我看不到任何技术问题。但是匿名内部类应该很小。通常实现单个方法。如果你想实现更多而不是单个接口,你可能最好使用顶级类。

当然,如果你绝对需要,你可以创建一个接口来组合你想要实现的所有接口,然后为此创建一个匿名类。当然新界面需要一个名字...

【讨论】:

    【解决方案4】:

    【讨论】:

      【解决方案5】:

      一个匿名类只能实现一个接口。为什么?这只是一种语言设计选择。从技术上讲,没有什么是不可能的。

      如果你想实现两个或多个接口,你必须将其设为一个命名类或使用一个中间接口或抽象类来扩展(接口)或实现(抽象类)两个或多个其他接口。此外,您只能通过一个接口名称来引用它,而不是两个,就像 Java 中的所有其他对象一样。

      【讨论】:

      • 很抱歉投了反对票,但作者问了“为什么?”它只能实现一个接口。这背后的原因是什么?
      • 好的,解释了原因。也许您现在可以删除您的反对票?
      猜你喜欢
      • 2016-01-19
      • 2013-09-22
      • 1970-01-01
      • 2013-09-20
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      相关资源
      最近更新 更多