为什么匿名类不能直接实现多个接口?仅仅因为语法还是有其他原因?

Zso*_*mbi 24 java anonymous-class inner-classes

在那里有一个内部问题,为什么java匿名类不能同时实现和子类?或者只是因为语法?

aio*_*obe 25

在那里有一个内部问题,为什么java匿名类不能同时实现和子类?

由于语法原因,我认为这是99%.类型参数甚至支持交集类型(<T extends InterfaceX & InterfaceY>)所以我不认为这样的特征会引入任何矛盾或复杂性.

例如,new (InterfaceX & InterfaceY)() { ... }可以将表达式编译成类似的东西

interface InterfaceXandY extends InterfaceX, InterfaceY {}
... new InterfaceXandY() { ... }
Run Code Online (Sandbox Code Playgroud)

没有添加此类功能的原因很可能是因为它是一个罕见的用例,其中有一个简单的解决方法.


在一个有点相关的说明.例如,您可以Serializable通过执行lambda实现

Runnable r = (Runnable & Serializable)() -> System.out.println("Serializable!");
Run Code Online (Sandbox Code Playgroud)

请参见如何序列化lambda?


bes*_*sss 6

完全是语法,所谓的匿名类是100%普通类.你可以通过使用java.lang.reflect.Proxy和InvocationHandler来实现一个时髦的结果,这将是最脏的方法.

更简单的方法包括在方法中声明类并只添加'implements',


nro*_*bey 6

提供匿名类作为快速简洁地构建"一次性"类的方法.您的问题表明您尝试以多种方式使用您的匿名类(至少一个接口,一个扩展).在这种情况下,如果将anon类提升为完整类,它将更具可读性和可维护性.

这也可以通过更好地管理类的封装来避免意外的副作用.


Gwi*_*lym 6

发现了这个黑客

在文件底部创建一个接口,扩展你想要实现的所有接口,然后创建一个实现它的匿名类.

  • 我不知道我会称之为黑客 (3认同)