我想要做的是这样的:
public class History {
public class State {
public enum StateType {
StateType
枚举必须定义在静态成员类型内部。这是 Eclipse 给出的编译错误信息。
当我将 State
类设置为静态时,该错误消失了。虽然我可以将 State
设置为静态,但我不明白为什么不能在内部类中声明 enum
。
我想要做的是这样的:
public class History {
public class State {
public enum StateType {
StateType
枚举必须定义在静态成员类型内部。这是 Eclipse 给出的编译错误信息。
当我将 State
类设置为静态时,该错误消失了。虽然我可以将 State
设置为静态,但我不明白为什么不能在内部类中声明 enum
。
由于JEP 395放宽了内部类中某些静态类型的规则,从Java 16开始(以及后来的LTS版本Java 17),这种做法不再被禁止。
§8.1.3. Inner Classes and Enclosing Instances中的新措辞为(重点在于“inner class may declare”):
所有适用于嵌套类的规则也适用于内部类。特别地,内部类可以声明和继承静态成员(§8.2),并声明
static
初始化器(§8.7),即使内部类本身不是static
。
枚举
类型如果被定义为嵌套类型,它们总是隐式地static
(详见JLS §8.9. Enums):
嵌套的枚举类型是隐式的
static
。
在非静态的嵌套类型(也称为“内部类”,详见JLS §8.1.3. Inner Classes and Enclosing Instances)中,你不能有一个静态嵌套类型:
如果内部类声明了一个显式或隐式的静态成员,除非该成员是常量变量,否则就会产生编译时错误
因此,在非静态的嵌套类型中无法有enum
内部类型。
enum
类型为什么隐式地是 static
的? - mrbela如果您像这样声明了一个枚举:
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. 内部类和封闭实例),而枚举合成类却有静态成员,因此它不适合作为内部类。
final static class Suit extends java.lang.Enum<Suit>
而不是final class Suit extends java.lang.Enum<Suit>
吗?因为枚举有静态变量(例如SPADES, CLUBS
等),而内部(嵌套非静态)类不能具有静态声明。 - Marko Cain已经有+Joachim Sauer提供了足够的信息,我只是添加了一些额外的细节。
如果您的内部类是静态嵌套内部类,则可以定义内部枚举。请参见下面的示例:
private static class DbResource {
public enum DB {
MERGE_FROM, MERGE_TO, MAIN;
}
}
最初的回答:
public class History {
public interface HConstants{
public enum StateType { PAST,CURRENT,FUTURE}
}
//Inner class
public class State implements HConstants{
public StateType stateField = StateType.PAST;