【问题标题】:Is it possible to declare anonymous class as abstract?是否可以将匿名类声明为抽象类?
【发布时间】:2016-09-04 08:40:25
【问题描述】:

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

“从 Test 派生的匿名类”类必须声明为抽象或在 Test 中实现抽象方法“method()”

代码:

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


如果可以将匿名类声明为抽象类,请告诉我该怎么做。
我会很高兴回答。

【问题讨论】:

  • 在什么情况下这样做才有意义?
  • 你不能声明一个匿名类抽象:根据定义,当你声明一个匿名类时,你正在创建一个新类的实例,这意味着它必须是具体的。
  • @OliverCharlesworth 正如我所提到的,我看不出任何意义,但我正在尝试理解编译器消息。
  • 抽象类不能只通过子类直接使用,但你不能有匿名类的子类,因为它没有你可以使用的名称,所以它会是毫无意义。
  • 编译器消息只是泛化的产物。编译器在所有情况下都简单地使用相同的文本片段,在这些情况下,继承的抽象方法没有实现。

标签: java abstract-class abstract anonymous-class


【解决方案1】:

JLS Sec 15.9.5(强调我的):

15.9.5。匿名类声明

匿名类声明由 Java 编译器自动从类实例创建表达式派生。

匿名类绝不是抽象的(第 8.1.1.1 节)。

匿名类总是隐式最终的(第 8.1.1.2 节)。

匿名类始终是内部类(第 8.1.3 节);它永远不是静态的(§8.1.1、§8.5.1)。

【讨论】:

    【解决方案2】:

    你不能也没有意义将匿名类声明为抽象类,因为匿名只用作本地类一次。

    我认为您收到此错误是因为类似问题Class must either be declared abstract or implement abstract method error

    【讨论】:

      【解决方案3】:

      正如 Andy Turner 所说,您的问题的答案是否定的。

      但是我认为你想知道一些不同的东西。

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

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

      1. 使派生类(通常是匿名类)抽象化, 这对于普通类和内部类来说很好,但对于匿名类是不可能的,所以编译器不应该首先建议它
      2. 实现所有方法,并且在匿名类声明中没有抽象方法

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-09-11
        • 1970-01-01
        • 2021-06-10
        • 2021-11-24
        • 1970-01-01
        • 2017-05-13
        • 2010-10-25
        • 2023-03-08
        • 2019-04-10
        相关资源
        最近更新 更多