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

在Java中将一个类中的枚举转换为另一个类中的枚举,java,enums,Java,Enums,我用Java编写了以下代码,试图将一个类中的enum转换为另一个类: class Test1 { UserType type; public enum UserType { PENDING, ACTIVE, INACTIVE, DELETED; } } class Test2 { UserType type; public enum UserType { PENDING, ACTIVE, I

我用Java编写了以下代码,试图将一个类中的enum转换为另一个类:

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


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

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


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

如果您同时拥有这两个类(Test1和Test2),我建议将UserType enum重构为自己的文件,然后在所有地方重用相同的枚举


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

您不能将一个赋值给另一个,因为它们是不兼容的类型。
对象可根据其层次结构进行分配,并且这些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;
    }
}

无法将一个分配给另一个,因为这些类型不兼容。
对象可根据其层次结构进行分配,并且这些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;
    }
}

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

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()));

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

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()));

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

错误消息清楚地指出,两个枚举都是不同的实体,因此不能将一个强制转换为另一个。两者都有不同的名称空间,都将编译为单独的枚举,都将在应用程序执行期间作为单独的实体存在,都将作为单独的实体加载

你有以下选择

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

  • 用两个方法定义一个类

    public Test1.UserType getTest1Usertype( Test2.UserType)
    
    public Test2.UserType getTest2Usertype( Test1.UserType)
    
  • 在这两种方法中,您都可以实现返回相应枚举的逻辑。在您的例子中,它将两个枚举的实例的
    name
    接缝为相同的,因此它将成为可以进行mappimg的comman因子


    请注意,选项1与选项2一样更好。如果枚举名称发生更改,或添加了新实例,则需要更新这些映射方法。您可以使用
    .name()
    检索类型
    字符串的名称(这将是两个枚举之间的公共匹配因子)并获取枚举实例,您可以使用
    .valueOf(字符串名称)

    两个枚举之间没有关系,除非它们都是枚举

    错误消息清楚地指出,两个枚举都是不同的实体,因此不能将一个强制转换为另一个。两者都有不同的名称空间,都将编译为单独的枚举,都将在应用程序执行期间作为单独的实体存在,都将作为单独的实体加载

    你有以下选择

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

  • 用两个方法定义一个类

    public Test1.UserType getTest1Usertype( Test2.UserType)
    
    public Test2.UserType getTest2Usertype( Test1.UserType)
    
  • 在这两种方法中,您都可以实现返回相应枚举的逻辑。在您的例子中,它将两个枚举的实例的
    name
    接缝为相同的,因此它将成为可以进行mappimg的comman因子


    请注意,选项1与选项2一样更好。如果枚举名称发生更改,或添加了新实例,则需要更新这些映射方法。您可以使用
    .name()
    检索类型
    字符串的名称(这将是两个枚举之间的公共匹配因子)并获取枚举实例,您可以使用
    .valueOf(String name)

    您的两个枚举是不同的类,为什么要将其定义为内部类?我认为您所做的工作无法正常工作。但是,你想做什么?有什么方法可以施展吗?你不能施展它们,它们是两个不同的物体。实现一个方法UserType.valueOf(UserType otherType)顺便说一句,在你的两个类之外定义一个UserType是实现伟大代码的更好方法。你的两个枚举是不同的类,为什么你要将它定义为内部类?我不认为你所做的是可以工作的。但是,你想做什么?有什么方法可以施展吗?你不能施展它们,它们是两个不同的物体。实现一个方法UserType.valueOf(UserType otherType)BTW,一个在您的2个类i之外定义的用户类型