在Java中,匿名类能够继承另一个类吗?

28

像这样的代码:

protected Interface1 varClass1 = new Interface1() {

但我也希望这个匿名嵌套类可以继承类Base,就像这样:

protected Interface1 varClass1 = new Interface1() extends Base {
....

在Java中是否有可能实现这个功能?


1
@EranMedan - 这个问题特别是关于同时执行两个操作:在实现接口的同时扩展一个类。另一个问题是单独执行其中一个操作。 - David Harkness
@DavidHarkness 你说得对,我不会再在凌晨5点上 Stack Overflow 了。 - Eran Medan
2
对我来说,你打算使用的匿名类有点分裂。特别是如果它需要与包含类的字段交互。我强烈建议你深思熟虑是否真正需要进行轻微的重新设计。 - Buhb
2个回答

31

匿名类可以实现一个接口或者继承一个类。

一种解决方法是创建一个实现Interface1并扩展Base的命名类,然后将其用作匿名类的基类:

public abstract class Base1 extends Base implements Interface1 {}

...

protected Interface1 varClass1 = new Base1() {
   ...

4
+1,好的解决方案!唯一需要补充的是,如果你需要这样做,那么这是一个提示,说明你正在超出匿名类的预期用法,也许应该考虑使用完整的命名内部类。 - mikera
1
为了限制 Base1 的作用域,您甚至可以在方法内部声明它,在使用之前声明即可。 - aioobe
@aioobe - 在 方法内部 - David Harkness
1
@DavidHarkness 在方法体内,您可以声明一个类:class Hello {} - Guillaume Polet
请注意,您可以在方法内部声明Base1(删除public),这样声明为抽象会更有趣。这样做看起来更符合OP的要求。 - Jerome
显示剩余2条评论

3
虽然不可能同时扩展一个类和实现一个接口,但您可能想要做的可以使用委托来实现。只需在匿名类的初始化程序中创建Base的实例,并从您从Interface1实现的方法中使用其方法即可。注意此处假设您仅因其实现而不是其接口而要继承Base,这是一个有效的假设,因为将对象分配给Interface1变量后,Base的接口是不可见的。因此,在这里最好使用委托而不是创建一个新类。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接