如何在Java中将值从一个枚举转换为另一个?

时间:2011-09-02 13:54:24

标签: java enums casting enumeration

如何在Java中将值从Enum1转换为Enum 2? 这是我正在尝试做的一个例子:

public enum Enum1 {
  ONE,
  TWO,
  THREE;
}

public enum Enum2 {
  FOUR,
  FIVE,
  SIX;
}

所以我想做这样的事情:

Enum2 en2 = (Enum2)ONE;

有可能,我该怎么做?

提前致谢!

11 个答案:

答案 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.FOUREnum1.TWO => Enum2.FIVEEnum1.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
}

此投射仅适用于常用值(例如上面的UNKNOWNNOT_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);

        }*