用Java将一类中的枚举转换为另一类

时间:2018-09-24 14:36:45

标签: java enums

我有以下Java代码,试图将一个类中的枚举转换为另一类:

class Test1 {

    UserType type;

    public enum UserType {
    PENDING,
    ACTIVE,
    INACTIVE,
    DELETED;
    }
}

class Test2 {

    UserType type;

    public enum UserType {
    PENDING,
    ACTIVE,
    INACTIVE,
    DELETED;
    }
}


public class TestClass {
    public static void main(String args[]) {
        Test1 test = new Test1();
        test.type = (Test2.UserType)Test1.UserType.PENDING;
    }
}

然后获得以下信息:     /TestClass.java:29:错误:类型不兼容:Test1.UserType无法转换为Test2.UserType             test.type =(Test2.UserType)Test1.UserType.PENDING;

如何将枚举从一个类转换为另一个类?

4 个答案:

答案 0 :(得分:1)

如果您同时拥有两个类(Test1和Test2),则建议将UserType枚举重构为自己的文件,然后在各处重复使用相同的枚举。

如果您不是这两个类的所有者,则必须编写一个转换器,将一个UserType转换为另一个UserType,因为它们是不同的类。对于转换,您可以例如。使用类似枚举值的序数。

答案 1 :(得分:1)

假设您无法重构代码,因此两个类都使用相同的顶级枚举,则可以依靠以下事实:枚举值都具有相同的名称:

Test1 test1 = new Test1();
test1.type = Test1.UserType.PENDING;
Test2 test2 = new Test2();
test2.type = Test2.UserType.valueOf(test1.type.name());
System.out.println(test2.type); // prints: PENDING

当然,您可能需要先检查null:

test2.type = (test1.type == null ? null : Test2.UserType.valueOf(test1.type.name()));

答案 2 :(得分:1)

两个枚举之间没有关系,只是它们都是枚举。

错误消息中非常清楚地提到两个枚举都是不同的实体,因此您不能将它们强制转换为另一个。两者都具有不同的名称空间,并且都将被编译为单独的枚举,并且在应用程序执行期间都将作为单独的实体存在,并且都将被单独加载。

您有以下选择

  1. 在单独的外部公共文件中提取枚举,并在需要时使用它。如果您可以重构代码,这将起作用。

  2. 用两个方法定义一个类

    public Test1.UserType getTest1Usertype( Test2.UserType)
    
    public Test2.UserType getTest2Usertype( Test1.UserType)
    

在这两种方法中,您都可以实现返回相应枚举的逻辑。在您的情况下,两个枚举实例的接缝name相同,因此它成为可用来执行mappimg的命令因子。

请注意,如果枚举名称发生更改或添加了新实例,则选项1会比选项2 更好,那么您需要更新这些映射方法。您可以使用.name()来检索类型String的名称(这将是两个枚举之间的通用匹配因子),并可以使用.valueOf(String name)

来获取枚举实例。

答案 3 :(得分:0)

您不能将一个分配给另一个,因为它们是不兼容的类型。
对象可以根据其层次结构进行分配,并且这些eunm类不属于同一层次结构。
此外,一般情况下,复制事物是一种难闻的气味:您不想定义两次枚举。

不是建议的解决方案,但要回答您的问题:您可以通过引入每个枚举类实现的接口使两个类互操作:

public interface IUserType {
    // define what it is required    
}

class Test1 {

    IUserType type;

    public enum UserType implements IUserType {
        PENDING, ACTIVE, INACTIVE, DELETED;
    }

    public static void main(String args[]) {
        Test1 test = new Test1();
        test.type = Test2.UserType.PENDING;    
    }

}

class Test2 {

    IUserType type;

    public enum UserType implements IUserType {
        PENDING, ACTIVE, INACTIVE, DELETED;
    }
}