您可以做的是拥有实现通用接口的枚举,然后利用这些接口:
public interface YourEnumInterface<E extends Enum<E> & YourEnumInterface<E>> {
//methods that your enum should be implementing
}
接口泛型声明的扩展是为了保证它只被实现你的接口的枚举调用
然后你必须指定的任何枚举都可以像这样实现它:
public enum MyEnum implements YourEnumInterface<MyEnum> {
// enum constants
TEST_VALUE;
// implementation of interface methods
}
从那里,您只需将 YourEnumInterface 作为一个对象,您可以为它们传递枚举值:
public void doSomething(YourEnumInterface enm) {
//work with enm
}
//Elsewheres...
doSomething(MyEnum.TEST_VALUE);
应该注意,一旦将枚举降低到接口本身,您将无法更改正在使用的常量(不进行强制转换,这可能是不安全的)。这实际上应该或多或少地用于将东西传递到仅与值一起使用的目的地(例如配置枚举或字符串的内部化等)
因此与强制子类实现它相关:
public class YourSuperClass {
public abstract YourEnumInterface symbol;
}
一个可运行的例子
public class EnumMagic {
public static void main(String[] args) {
YourSubClass clazz = new YourSubClass();
//prints the default value
System.out.println(clazz.getEnum().getValue());
//gets the value of a specified enum constant
System.out.println(clazz.getEnum().SECOND_TEST.getValue());
}
}
abstract class YourSuperClass {
protected YourEnumInterface symbol;
public abstract YourEnumInterface getEnum();
}
interface YourEnumInterface<E extends Enum<E> & YourEnumInterface<E>> {
public int getValue();
}
class YourSubClass extends YourSuperClass {
public enum MyEnum implements YourEnumInterface<MyEnum> {
TEST_VALUE(1),
SECOND_TEST(2);
private final int val;
private MyEnum(int example) {
this.val = example;
}
public int getValue() {
return this.val;
}
}
public YourSubClass() {
this.symbol = MyEnum.TEST_VALUE;
}
public MyEnum getEnum() {
return MyEnum.TEST_VALUE;
}
}
这个程序的输出是:
1
2
您可以通过getEnum 简单地获取类的指定枚举常量,它们将返回自己的内部枚举。
但是,一旦向下转换为超级类型,例如YourSuperClass intc = clazz;,那么您将失去指定枚举本身的能力。根据您存储实例的方式,将确定这是否需要更改。