Конвертировать enum в одном классе в Java - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть следующий код на 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: error: несовместимые типы: Test1.UserType не может быть преобразован в Test2.UserType test.type = (Test2.UserType) Test1.UserType.PENDING;

Как привести перечисление из одного класса в другой класс?

Ответы [ 4 ]

0 голосов
/ 24 сентября 2018

Нет никакого отношения между двумя перечислениями, за исключением того, что они оба являются перечислениями.

В сообщении об ошибке очень четко упоминается, что оба перечисления являются разными сущностями, и, следовательно, вы не можете преобразовать одно в другое .Оба имеют различное пространство имен, и оба будут скомпилированы как отдельные перечисления, оба будут существовать при выполнении приложения как отдельные объекты, оба будут загружены как отдельные.

У вас есть следующие варианты

  1. Извлеките enum в отдельный внешний публичный файл и используйте его, когда вам это нужно.Это сработает, если вы сможете изменить код.

  2. Определить класс двумя методами

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

В обоих этих методах вы можетереализовать логику для возврата соответствующих перечислений.В вашем случае он выглядит как name как один и тот же для экземпляров обоих перечислений, поэтому он становится запятым фактором, на основе которого вы можете сделать отображение.

Обратите внимание, что опция лучше, чем в опции 2 , в случае изменения имен перечислений или добавления новых экземпляров, вам необходимо обновить эти методы отображения.Вы можете использовать .name(), чтобы получить имя типа String (которое будет общим фактором совпадения между двумя перечислениями) и чтобы получить экземпляр перечисления, вы можете использовать .valueOf(String name)

0 голосов
/ 24 сентября 2018

Вы не можете назначить один другому, потому что это несовместимые типы.
Объекты совместимы для назначения в соответствии с их иерархией, и эти классы 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;
    }
}
0 голосов
/ 24 сентября 2018

Если вы не можете реорганизовать код, чтобы оба класса использовали одно и то же перечисление верхнего уровня, вы можете полагаться на тот факт, что все значения перечисления имеют одно и то же имя:

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

Конечно, вы можетесначала нужно проверить на ноль:

test2.type = (test1.type == null ? null : Test2.UserType.valueOf(test1.type.name()));
0 голосов
/ 24 сентября 2018

Если вы владеете обоими классами (Test1 и Test2), я бы порекомендовал реорганизовать перечисление UserType в собственный файл, а затем повторно использовать одно и то же перечисление повсеместно.

Если вы не являетесь владельцемиз этих двух классов вы должны написать конвертер, который преобразует один тип пользователя в другой, поскольку это разные классы.Для преобразования вы можете, например.используйте что-то вроде порядкового номера значения enum.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...