是否可以将匿名 class 声明为抽象的?

Is it possible to declare anonymous class as abstract?

我正在尝试找出是否可以将匿名内部 class 创建为抽象。
我认为这没有意义,因为我正在尝试创建抽象的实例 class,但来自编译器的消息让我感到困惑:

Class 'Anonymous class derived from Test' 必须 声明为抽象 或在 Test

中实现抽象方法 'method()'

代码:

abstract class Test{
    abstract void method();
}
Test o = new Test(){};


如果可以将匿名 class 声明为抽象,请告诉我该怎么做。
我很乐意回答。

参见 JLS Sec 15.9.5(强调我的):

15.9.5. Anonymous Class Declarations

An anonymous class declaration is automatically derived from a class instance creation expression by the Java compiler.

An anonymous class is never abstract (§8.1.1.1).

An anonymous class is always implicitly final (§8.1.1.2).

An anonymous class is always an inner class (§8.1.3); it is never static (§8.1.1, §8.5.1).

您不能也没有意义将匿名 class 声明为抽象 class 因为匿名仅用作本地 class 一次。

我认为您是因为类似的问题而收到此错误的

正如安迪·特纳 (Andy Turner) 所说,您问题的答案是否定的。

不过我想你想知道一些不同的东西。

为什么会收到此编译器消息?

嗯,编译器在这里有点误导。它提供了两种可能的解决方案,基于您正在声明一个 class(那个匿名 class)然后还想创建那个 class:

的一个实例
  1. 使派生的 class(匿名 class 始终是)抽象, 这对于普通和内部 classes 没问题,但对于匿名 classes 是不可能的,所以编译器不应该首先建议它
  2. 实现所有方法并且在你的匿名 class 声明中没有抽象方法

所以要解决您的实际问题: 只需实现 method() 这样您的匿名 class 声明就不再包含抽象方法

abstract class Test{
    abstract void method();
}
Test o = new Test()
{
  void method()
  {
    // do something 
  };
};

现在一切都已声明,编译器应该不会再抱怨了。