Ste*_*ose 57 java enums nested inner-classes
我尝试做的是:
public class History {
public class State {
public enum StateType {
Run Code Online (Sandbox Code Playgroud)
Eclipse给出了我的编译错误StateType:The member enum StateType must be defined inside a static member type.
当我使State类静态时,错误消失.我可以制作State静态,但我不明白为什么我不能enum在内部类中声明.
Joa*_*uer 91
enum定义为嵌套类型的类型总是隐式的static(参见JLS§8.9.枚举)
您不能在非静态类型中使用静态嵌套类型(也称为"内部类",请参阅JLS§8.1.3.内部类和封闭实例).
因此,您不能enum在非静态嵌套类型中具有内部类型.
Edw*_*rzo 12
如果您声明了这样的枚举:
enum Suit {SPADES, HEARTS, CLUBS, DIAMONDS}
Run Code Online (Sandbox Code Playgroud)
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();
}
Run Code Online (Sandbox Code Playgroud)
除了那些已在其中定义的静态字段之外,无意创建此类的其他实例(正如您可以从其私有构造函数中推断的那样),但最重要的是,如接受的答案中所提到的,内部类不能具有静态成员(JLS§8.1.3.内部类和封闭实例),并且由于枚举合成类的确如此,它使得内部类不可接受.
来自+ Joachim Sauer的足够信息,我只是添加了一些额外的细节.
仅当内部类是静态嵌套内部类时,才可以定义内部枚举.见下文
private static class DbResource {
public enum DB {
MERGE_FROM, MERGE_TO, MAIN;
}
}
Run Code Online (Sandbox Code Playgroud)