我有以下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;
如何将枚举从一个类转换为另一个类?
答案 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)
两个枚举之间没有关系,只是它们都是枚举。
错误消息中非常清楚地提到两个枚举都是不同的实体,因此您不能将它们强制转换为另一个。两者都具有不同的名称空间,并且都将被编译为单独的枚举,并且在应用程序执行期间都将作为单独的实体存在,并且都将被单独加载。
您有以下选择
在单独的外部公共文件中提取枚举,并在需要时使用它。如果您可以重构代码,这将起作用。
用两个方法定义一个类
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;
}
}