为什么我不能在Java的内部类中创建枚举?

2022-08-31 13:50:26

我试图做的是这样的:

public class History {
    public class State {
        public enum StateType {

Eclipse 在 : 上给了我这个编译错误。StateTypeThe member enum StateType must be defined inside a static member type

当我使类成为静态时,错误消失了。我可以使静态,但我不明白为什么我不能在内部类中声明一个。StateStateenum


答案 1

enum定义为嵌套类型的类型始终是隐式的(请参阅 JLS §8.9.枚举static)

你不能在非静态类型(又名“内部类”,参见JLS §8.1.3)中拥有静态嵌套类型。内部类和封闭实例)。

因此,不能在非静态嵌套类型中具有内部类型。enum


答案 2

如果您像这样声明了枚举:

enum Suit {SPADES, HEARTS, CLUBS, DIAMONDS}

Java 编译器将综合生成以下类:

final class Suit extends java.lang.Enum<Suit> {
  public static final Suit SPADES;
  public static final Suit HEARTS;
  public static final Suit CLUBS;
  public static final Suit DIAMONDS;
  private static final Suit[] $VALUES;
  public static Suit[] values();
  public static Suit valueOf(java.lang.String);
  private Suit();
}

除了已经在其中定义的那些静态字段之外,无意创建此类的其他实例(您可以从其私有构造函数中推断),但最重要的是,正如在接受的答案中提到的,内部类不能具有静态成员(JLS §8.1.3.内部类和封闭实例),并且由于枚举合成类确实如此,因此它不能作为内部类。