大家好,我想知道为什么Java匿名类无法实现多个接口?
如果Java设计者允许匿名类实现多个接口,我们会遇到什么问题?
因此:
IMammal, I4legged anonymous_creature = new IMammal, I4legged() {
{
//..
}
};
anonymous_creature.FourLeggedStuff();
anonymous_creature.MammalStuff();
答案 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)
http://books.google.it/books?id=G4ridwFSpIoC&pg=PA472&lpg=PA472#v=onepage&q&f=false 段落以“还有一件事......”开头。
答案 4 :(得分:0)
匿名类只能实现一个接口。为什么?它只是一种语言设计选择。没有什么能让技术上变得不可能。
如果要实现两个或更多接口,则必须使其成为命名类,或者使用扩展(接口)或实现(抽象类)两个或更多其他接口的中间接口或抽象类。此外,您只能通过一个接口名称而不是两个接口来引用它,就像Java中的所有其他对象一样。