如何在Java中将值从Enum1转换为Enum 2? 这是我正在尝试做的一个例子:
public enum Enum1 {
ONE,
TWO,
THREE;
}
public enum Enum2 {
FOUR,
FIVE,
SIX;
}
所以我想做这样的事情:
Enum2 en2 = (Enum2)ONE;
有可能,我该怎么做?
提前致谢!
答案 0 :(得分:18)
您无法从一个枚举转换为另一个枚举,但每个枚举都有保证顺序,您可以轻松地将一个枚举转换为另一个(保留顺序)。例如:
enum E1 {
ONE, TWO, THREE,
}
enum E2 {
ALPHA, BETA, GAMMA,
}
我们可以通过以下方式将E1.TWO
翻译为/ E2.BETA
static E2 E1toE2(E1 value) {
return E2.values()[value.ordinal()];
}
static E1 E2toE1(E2 value) {
return E1.values()[value.ordinal()];
}
答案 1 :(得分:7)
这是不可能的。 Enum1和Enum2是不同的类型,没有任何共同点。
答案 2 :(得分:5)
您可以在Enum1中定义一个方法以返回相应的Enum2:
enum Enum1 {
ONE {
@Override
public Enum2 toEnum2() {
return Enum2.ALFA;
}
},
TWO {
@Override
public Enum2 toEnum2() {
return Enum2.BETA;
}
}
,
THREE {
@Override
public Enum2 toEnum2() {
return Enum2.GAMMA;
}
}
;
public abstract Enum2 toEnum2();
}
enum Enum2 {
ALFA, BETA, GAMMA;
}
或者,更具可读性(IMO):
enum Enum1 {
ONE(Enum2.ALFA),
TWO(Enum2.BETA),
THREE(Enum2.GAMMA);
private final Enum2 enum2;
private Enum1(Enum2 enum2) {
this.enum2 = enum2;
}
public Enum2 toEnum2() {
return enum2;
}
}
enum Enum2 {
ALFA, BETA, GAMMA;
}
编辑:
如果你需要维护解耦的2个枚举,请创建一个包含从Enum1到Enum2的映射的映射(在第3个实用程序类中)。
答案 3 :(得分:5)
这个问题的答案可能取决于"铸造"预计会这样做:
在提供的示例中,两个枚举中的值集之间没有共性,因此我假设其意图是按顺序位置进行转换,以便Enum1.ONE
=> Enum2.FOUR
,Enum1.TWO
=> Enum2.FIVE
和Enum1.THREE
=> Enum2.SIX
。这可以按如下方式完成:
Enum2 en2 = Enum2.values()[Enum1.ONE.ordinal()];
下一个自然的问题是如何将其扩展到对任何两个enum
类型执行相同操作的泛型函数。不适合胆小的人,但以下人员会做这件事(需要番石榴):
public <F extends Enum<F>> F castByOrdinal(Enum<?> e, Class<F> fClass) {
return Iterators.get(EnumSet.allOf(fClass).iterator(), e.ordinal());
}
如果Google Guava库不存在,可以通过几行代码手动完成:
public <F extends Enum<F>> F castByOrdinal(final Enum<?> e, final Class<F> fClass) {
final Iterator<F> iter = EnumSet.allOf(fClass).iterator();
int count = 0;
F fValue = null;
while (count <= e.ordinal()) {
if (!iter.hasNext()) {
return null; // Or throw exception if preferred e.g. IndexOutOfBoundsException
}
fValue = iter.next();
count++;
}
return fValue;
}
使用示例:
Enum2 en2 = castByOrdinal(Enum1.ONE, Enum2.class);
在枚举之间存在另一种可能的方式,它们共享一些相同的值名称:
E.g:
enum Shape {
TRIANGLE, SQUARE, PENTAGON, HEXAGON, UNKNOWN, NOT_APPLICABLE
}
enum Size {
SMALL, MEDIUM, LARGE, UNKNOWN, NOT_APPLICABLE
}
此投射仅适用于常用值(例如上面的UNKNOWN
和NOT_APPLICABLE
),可以按以下方式完成:
Size size = Size.valueOf(Shape.UNKNOWN.name());
如果目标枚举中不存在值名称,则会抛出IllegalArgumentException。这次泛型方法可以更简单一些:
public <F extends Enum<F>> F castByName(final Enum<?> e, final Class<F> fClass) {
return F.valueOf(fClass, e.name());
}
使用示例:
Size size = castByName(Shape.UNKNOWN, Size.class);
答案 4 :(得分:3)
你不能这样做,因为它们是不同类的对象。
你可以根据序数值或名称将从一个转换为另一个,但我会质疑任何需要这样做的程序的设计。
答案 5 :(得分:3)
你不能;但您可以使用翻译代码在枚举中创建静态方法。但是你必须清楚地了解你想要实施的规则。
答案 6 :(得分:3)
即使这张票很久以前还活跃了,我又增加了另一种可能性:
你也可以创建一个地图,例如像这样:
HashMap<Enum1, Enum2> e1ToE2 = new HashMap<Enum1, Enum2>();
e1ToE2.put(Enum1.ONE, Enum2.FOUR);
e1ToE2.put(Enum1.TWO, Enum2.FIVE);
使用
Enum2 e2 = e1ToE2.get(Enum1.ONE);
(+)你不必仔细检查元素的顺序
(+)易于阅读
(+)快
( - )需要空格
如果我错了,请纠正我:)
答案 7 :(得分:2)
无法进行强制转换操作,但您可以为enum1编写静态成员函数,将enum2强制转换为enum1:
public static Enum1 fromEnum2(Enum2 enum2) {
...
}
顺便说一句,您可以为两个枚举的每个常量分配一个ID,从而简化了实现。
Here是关于枚举的教程。
答案 8 :(得分:0)
它可能对您没有帮助,但您可以
public enum Enum1 implements MyInterface {...}
public enum Enum2 implements MyInterface {...}
我们没有足够的信息来说明您要采取哪些措施来帮助您。 将枚举转换为另一个枚举是没有意义的。
答案 9 :(得分:0)
您无法从一个枚举转换为另一个枚举,但每个枚举都有保证顺序,您可以轻松地将一个枚举转换为另一个枚举
答案 10 :(得分:-1)
您可以使用简单的方法执行此操作:
public enum number{one,two};
public enum number1{one,two};
public void castTonumber1(number number){
number1 num1 = number1.valueOf(number.one.toString());
System.out.println( "value of number 1 is " + num1);
}*