【问题标题】:In Java, can anonymous classes extend another class?在Java中,匿名类可以扩展另一个类吗?
【发布时间】:2012-05-15 18:42:39
【问题描述】:

代码如下:

protected Interface1 varClass1 = new Interface1() {

但我也希望这个匿名嵌套类也扩展类Base,类似于:

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

这在 Java 中可行吗?

【问题讨论】:

  • @EranMedan - 这个问题特别是关于同时做这两个:在实现接口的同时扩展一个类。另一个问题是关于单独做任何一个。
  • @DavidHarkness 你是对的,早上 5 点对我来说不再如此
  • 对我来说,感觉你打算的匿名课程有点精神分裂症。特别是如果它需要与包含类的字段进行交互。我强烈建议您考虑一下您真正需要的是稍微重新设计。

标签: java class nested extend anonymous


【解决方案1】:

匿名类可以只实现一个接口扩展一个类。

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

public abstract class Base1 extends Base implements Interface1 {}

...

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

【讨论】:

  • +1,很好的解决方案!我唯一要补充的是,如果您需要这样做,那么这暗示您超出了匿名类的预期用途,也许应该考虑使用全名内部类。
  • 要限制Base1 的范围,您甚至可以在方法中声明它,就在使用它之前。
  • @aioobe - 方法内部?
  • @DavidHarkness 在方法体内可以声明一个类:class Hello {}
  • @aix: 创建对象时继承可以做同样的事情吗?
【解决方案2】:

虽然不可能同时扩展一个类并实现一个接口,但您可能要做的事情可以使用delegation 来实现。

只需在您的匿名类的初始化程序中创建一个Base 的实例,并使用您从Interface1 实现的方法中的方法。

编辑:我的回答假设您只想从Base 继承,因为它的实现,而不是因为它的接口。这是一个有效的假设,因为在将对象分配给 Interface1 变量后,Base 的接口不可见。因此,我认为这里最好使用委托,而不是创建一个新类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多