代码之家  ›  专栏  ›  技术社区  ›  ratzip

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

  •  0
  • ratzip  · 技术社区  · 7 年前

    我用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;
        }
    }
    

    然后得到以下信息: test.type=(Test2.UserType)Test1.UserType.PENDING;

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

    4 回复  |  直到 7 年前
        1
  •  1
  •   Andreas dfa    7 年前

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

    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
  •   triplem    7 年前

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

        3
  •  1
  •   nits.kk    7 年前

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

    你有以下选择

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

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

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

    请注意 选项1比选项2更好 如果枚举名称发生更改,或者添加了新实例,则需要更新这些映射方法。你可以用 .name() 检索类型的名称 String .valueOf(String name)

        4
  •  0
  •   davidxxx    7 年前


    对象可以根据其层次结构进行分配,并且这些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;
        }
    }