72

我尝试做的是:

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

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

当我将State类设为静态时,错误消失了。我可以制作State静态,但我不明白为什么我不能enum在内部类中声明一个。

4

4 回答 4

96

enum定义为嵌套类型的类型始终是隐式的static(参见JLS §8.9. Enums

您不能在非静态类型中使用静态嵌套类型(也称为“内部类”,请参阅JLS §8.1.3。内部类和封闭实例)。

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

于 2013-02-13T16:23:47.840 回答
18

如果您声明这样的枚举:

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. Inner Classes and Enclosure Instances),并且由于枚举合成类确实如此,因此它作为内部类是不可接受的。

于 2017-10-05T21:29:00.210 回答
6

+Joachim Sauer 已经提供了足够的信息,我只是添加了一些额外的细节。

只有当您的内部类是静态嵌套内部类时,您才能定义内部枚举。见下文

private static class DbResource {

    public enum DB {
        MERGE_FROM, MERGE_TO, MAIN;
    }
}
于 2016-01-30T10:08:02.917 回答
1

这适用于我的用例:

public class History {

    public interface HConstants{
         public enum StateType { PAST,CURRENT,FUTURE}
    }

    //Inner class
    public class State implements HConstants{
        public StateType stateField = StateType.PAST;
于 2019-03-08T17:40:32.243 回答