为什么匿名类不能直接实现多个接口? 仅仅因为语法还是有另一个原因?
在那里有一个内部问题,为什么java匿名类不能同时实现和子类? 或者只是因为语法?
在那里有一个内部问题,为什么java匿名类不能同时实现和子类?
由于语法原因,我认为这是99%。 类型参数甚至支持交集类型 (
)所以我不认为这样的function会引入任何矛盾或复杂性。
像new (InterfaceX & InterfaceY)() { ... }
这样的表达式可以编译成类似的东西
interface InterfaceXandY extends InterfaceX, InterfaceY {} ... new InterfaceXandY() { ... }
没有添加这样的function的原因很可能是因为它是一个罕见的用例,其中有一个简单的解决方法。
在一个有点相关的说明。 您可以通过执行将lambda实现为Serializable
实例
Runnable r = (Runnable & Serializable)() -> System.out.println("Serializable!");
请参见如何序列化lambda?
完全是语法,所谓的匿名类是100%普通类。 你可以通过使用java.lang.reflect.Proxy和InvocationHandler来实现一个时髦的结果,这将是最脏的方法。
更简单的方法包括在方法中声明类并只添加’implements’,
提供匿名类作为快速简洁地构建“一次性”类的方法。 您的问题表明您尝试以多种方式使用您的匿名类(至少一个接口,一个扩展)。 在这种情况下,如果将anon类提升为完整类,它将更具可读性和可维护性。
这也可以通过更好地管理类的封装来避免意外的副作用。
找到了一个黑客围绕这个
在文件底部创建一个接口,扩展你想要实现的所有接口,然后创建一个实现它的匿名类。
James Gossling说 :
由于时间压力而不是其他任何因素,闭包最初被排除在Java之外。 在Java的早期阶段,缺乏关闭是非常痛苦的,因此内部阶级诞生了:一种不舒服的妥协,试图避免一些棘手的问题。 但正如在许多设计问题中一样正常,简化并没有真正解决任何问题,他们只是移动了它们。
有趣的是,现在lambda表达式和闭包被添加到Java中,并且这次使用了不同于内部类的东西,我们可以动态定义由多个接口组成的对象,前提是第二个是标记接口。
interface Bar { default String getName() { return "Bar"; } } Object o = (Comparable & Bar) (x,y) -> x > y ? x : y; Bar b = (Bar) o; System.out.println(b.getName()); //Bar
这在我最新版本的JDK 8(2013年3月12日)中编译并运行完美。 所以,这次看起来他们一直在考虑这个问题。