这不是enum中新功能的问题。 这不是一个等待答案的问题 枚举相当于类xyz扩展Enum。如果您希望宣传如何使用枚举,请参阅众多教程,请不要回答。
这个问题具体是关于如何使用java.lang.Enum类。 相反,java.lang.Enum不能直接扩展也不能实例化,对吧? 确实,java.lang.Enum只是为了枚举类型而没有其他权利吗?
如果是这样,变色是没有意义的,对吧?即使编译器允许它。
final static Enum<colors> colours = null;
enum colors {"R","G","B"};
那么,除了null之外,还有什么可能等同于变量颜色。
当然,编译器不允许我这样做
class BaseColour extends Enum<BaseColour>{ ,,,}
但它允许enum成为一个不公平的优势,能够将其作为编译器的幕后操作。
我问这个问题,因为我希望做这样的事情
class Reddish extends BaseColour {"Crimson", "Blood", "Pink"};
class Purplish extends BaseColour {"Violet", "Evening Sky", "Brinjal"};
class Greenish extends BaseColour {"Algae", "Leaf"};
我希望将这些中的任何一个,以及任何这些枚举类型传递给方法
void squeezeColour(BaseColour colourConstraint)
{ ... }
有可能吗? / **如果没有,如果您恰好是James Gosling等人,您是否会考虑将其用于下一版本的Java规范? ** /
进一步提问:我忘记说这个...... 我正在研究的是使用EnumMap或EnumSet并利用contains和range方法。这是我能做的最好的吗?
答案 0 :(得分:1)
如果你想这样做,你必须自己做,不使用枚举。如果你谷歌旧的“类型安全枚举”模式,你会找到一个合理的方式。
这是因为Enum类中的方法,例如values()和ordinal()。
如果你可以通过扩展来添加值,那么它们应该如何在基类的values()方法中结束。如果你不想在基本枚举的values()方法中使用它们,那么它会破坏以下规则:
X instanceof MyEnum =&gt; MyEnum.values()包含X
Reddish.ordinal()应该不同意BaseColour.ordinal()或同意。这应该是怎么回事。它可以解决(正如C ++调度表所示),但几乎肯定不值得付出努力。
答案 1 :(得分:1)
您可以使用Dictionary将抽象外观(红色)映射到Enum。这样你就可以保留Enum,你可以使用字典方法对它进行比较。
答案 2 :(得分:-2)
内部实际上是一个整数常量。或者至少,JVM可以自由地将其视为一个,正是因为这种限制让您感到沮丧。这使得枚举变得高效,但却以打破面向对象为代价。
我建议您恢复枚举语法之前使用的旧“类型检查枚举”模式。
class Foo {
// the constants
public static final Foo RHUBARB = new Foo();
public static final Foo CUSTARD = new Foo();
// only this class and subclasses can create constants
protected Foo(){ }
}