我已经给了一个枚举ABC和一个类Test,我必须调用doSomething但是我不能将ABC枚举作为参数传递。
enum ABC{
A,B,C;
}
Class Test{
public void doSomething(ABC abc)
{
//some work
}
}
这里我想要一个enum DEF,它应该包含ABC的所有成员,它还应该包含enum XYZ的成员(我想要一个应包含两个枚举成员的枚举DEF(ABC和XYZ))。像这样的例子。
enum DEF
{
A,B,C,X,Y,Z,D;
}
enum xyz{
X,Y,Z;
}
这样我就可以调用doSomething方法,它只接受ABC枚举作为参数。我想用DEF.Example
调用doSomething()方法 class Demo{
public static void main(String[] ags)
{
Test test= new Test();
test.doSomething(DEF.A);
}
}
我更新鲜。请向我提供任何帮助或建议。我将非常感谢你。
答案 0 :(得分:9)
Java中的枚举是final
,这意味着您无法扩展和枚举(您无法向现有枚举添加更多值)。在您的情况下,ABC
和DEF
是完全不同的实体,具有与枚举项相同的简单名称。这意味着例如ABC.A != DEF.A
。
有很多方法可以解决这个问题,但是没有一种方法可以完美或简单。您应该评估您的具体案例所需的内容。
处理这种情况的第一种方法是创建一个公共接口,您的枚举可以扩展:
interface MyInterface{
}
enum ABC implements MyInterface{
A,B,C;
}
enum DEF implements MyInterface{
A,B,C,X,Y,Z,D;
}
这样您就可以在ABC
中同时使用DEF
和doSomething()
:
Class Test{
public void doSomething(MyInterface abc)
{
//some work
}
}
其他方法是在您的班级中添加泛型。这样您就可以创建支持指定枚举的具体实现:
class GenericTest<E extends Enum<E>>{
public void doSomething(E enum){
}
}
class TestWhichAcceptsABC extends GenericTest<ABC>{}
class TestWhichAcceptsDEF extends GenericTest<DEF>{}
第三种方法是创建多个方法,每个方法对应一个需要处理的枚举
Class Test{
public void doSomething(ABC abc)
{
//some work
}
public void doSomething(DEF abc)
{
//some work
}
}
有关如何解决枚举继承的更多建议,请参阅This thread。
答案 1 :(得分:1)
即使你在同名中提到它在枚举中也没有意思相同。
例如,ABC
中的示例A是ABC的实例。但是DEF
中的A是DEF的实例。所以它与众不同。您可以在枚举中实现接口。
enum ABC implements X{
A,B,C;
}
public class Test{
public void doSomething(X x)
{
}
}
你会试试这个。
答案 2 :(得分:-2)
您无法扩展枚举,但您可以通过模拟枚举的行为来完成下一个最好的事情。您可以创建具有静态值的类。像这样。
public class abc extends yxz {
public static final int A = 1;
public static final int B = 2;
public static final int C = 3;
}