我对java很新,并且习惯于枚举基本上只是命名的整数列表。
现在我正在编写一个实现,其中父类有几个以枚举值作为参数的方法。枚举将在子类中定义,并略有不同。因为枚举似乎表现得像类,所以这不像我预期的那样工作。定义的每个枚举将被视为不同类型的对象,父类必须选择一个定义的枚举作为参数。
是否有一种好方法可以让父类接受在其子类中定义的任何枚举?或者我是否必须为此编写自定义类?
编辑:这是我的例子,根据Jon Skeets的回答,对于那些正在研究如何在以后执行此操作的人来说:
class Parent {
protected interface ParentEvent {}
private HashMap<ParentEvent, String> actions = new HashMap<ParentEvent, String>();
protected void doStuff(ParentEvent e){
if(actions.containsKey(e)){
System.out.println(actions.get(e));
}
}
}
class Child extends Parent {
enum Event implements ParentEvent {EDITED, ADDED, REMOVED}
public void trigger(){
doStuff(Event.REMOVED);
}
}
答案 0 :(得分:9)
您可以让您的枚举实现一个接口,然后为您的父类方法提供该接口类型的参数。
正如你所说,枚举在Java中有很大的不同。它们不是命名数字 - 它们是一组固定的值,但这些值是面向对象的(即它们可以使用多态性等)。除了关于初始化排序的一些棘手问题之外,Java还有很多不足之处。
答案 1 :(得分:2)
如果我理解正确,你想为你的枚举设置一个公共基类,并希望为子类定义几个不相关的枚举集。对于java的类型安全枚举,这是不可能的,因为它们不允许您定义基类。
当然,仅仅定义一个枚举并且总是扩展其值不是一个选项,因为这显然违反了开放式原则。
对于这样一个用例,我对Josh Bloch的Typesafe Enum模式有相当好的经验,他在Effective Java中描述了
只需在此处介绍您的超类,并为您的客户端类所需的每个枚举值创建不同的子类。
答案 2 :(得分:0)
我不确定,但也许这就是你想要的:
public abstract class EnumTest<E extends Enum<E>> {
public abstract void frobnicate(E value);
}
public class Derived extends EnumTest<Derived.DerivedEnum> {
public void frobnicate(DerivedEnum value) {
System.out.println(value);
}
public static enum DerivedEnum {
FOO, BAR,
}
}
答案 3 :(得分:0)
如果枚举适用于不同的类,则可以在自己的文件中定义枚举。它们不需要嵌套在类中。
但是,您不能将一组枚举扩展到另一组。
我花了一段时间才摆脱了枚举“只是一个整数”的心态。