我有一个枚举,我们称之为A:
public enum A
{
A,
B
}
我有一个带枚举A:
的函数public void functionA(A enumA)
{
//do something
}
如何创建另一个枚举,可以调用B,我可以传递给 functionA ?像这样的东西?
public enum B
{
C
}
functionA(B.C);
我知道你不能扩展枚举,但我还有其他选择吗?实现这一目标的最佳方法是什么?
答案 0 :(得分:48)
你不能。
枚举类型是最终的设计。
原因是每个枚举类型应该只有枚举中声明的元素(例如,我们可以在switch语句中使用它们),如果允许扩展,这是不可能的类型。
您可能会这样做:
public interface MyInterface {
// add all methods needed here
}
public enum A implements MyInterface {
A, B;
// implement the methods of MyInterface
}
public enum B implements MyInterface {
C;
// implement the methods of MyInterface
}
请注意,使用此界面无法执行switch
。 (或者一般来说switch
有一个可能来自多个enum
的对象。
答案 1 :(得分:17)
您可以实现通用界面
interface I { }
enum A implements I {
A, B
}
enum B implements I {
C
}
public void functionA(I i) {
//do something
}
obj.functionA(A.A);
obj.functionA(B.C);
答案 2 :(得分:5)
您不能让Enums扩展其他枚举,但您可以声明一个所有Enum都可以实现的接口。接口必须包含您希望在Enum值上调用的任何方法。这是一个例子......
public class Question6511453 {
public static void main(String[] args) {
System.out.println(functionFoo(EnumA.FirstElem));
System.out.println(functionFoo(EnumA.SecondElem));
System.out.println(functionFoo(EnumB.ThirdElem));
}
private interface MyEnums {
int ordinal();
}
private enum EnumA implements MyEnums {
FirstElem,
SecondElem
}
private enum EnumB implements MyEnums {
ThirdElem
}
private static int functionFoo(MyEnums enumeration) {
return enumeration.ordinal();
}
}
这个解决方案的唯一问题是它会像你在switch语句中一样想要使用Enum,因为序数和值可能不再是唯一的。
这应该回答你的问题,但我怀疑它实际上会帮助你解决问题。 :(
答案 3 :(得分:4)
你应该将项目C添加到你的枚举A.如果它是不相关的东西并且添加它没有意义,functionA()可能不应该是处理它的那个。