为什么Java匿名类无法实现多个接口?

时间:2011-11-24 09:19:54

标签: java

  

可能重复:
  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();

5 个答案:

答案 0 :(得分:5)

  

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

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

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

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

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

interface FourLeggedMammal extends IMammal, I4Legged {
}

然后再做

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

答案 1 :(得分:2)

您可以通过abstract课程:

public abstract class AFourLeggedMammal implements IMammal, I4legged {
}

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

AFourLeggedMammal dog = new AFourLeggedMammal() {

}

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

答案 2 :(得分:1)

我无法看到任何技术问题。但匿名内部类应该很小。通常实现单个方法。如果你想实现更多的单一界面,你可能更适合顶级课程。

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

答案 3 :(得分:0)

答案 4 :(得分:0)

匿名类只能实现一个接口。为什么?它只是一种语言设计选择。没有什么能让技术上变得不可能。

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