在Java中将一个类中的枚举转换为另一个类中的枚举
我用Java编写了以下代码,试图将一个类中的enum转换为另一个类:在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
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之外定义的用户类型