Как бросить один объект в другой

Я новичок в Java и имею менее 2 Beans / POJOS в моем существующем приложении компании:

Пользователь

public class User {

public int getUserId() {
    return userId;
}

public void setUserId(int userId) {
    this.userId = userId;
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

}

Наемный рабочий

public class Employee {


public int getUserId() {
    return userId;
}
public void setUserId(int userId) {
    this.userId = userId;
}
public String getUsername() {
    return username;
}
public void setUsername(String username) {
    this.username = username;
}

}

Я хочу преобразовать User в Employee, потому что в приложении я бы получал объект User в одном из методов, который используется для сохранения в database с использованием метода сопоставления xml hibernate3. Отображение HIbernate существует для объекта Employee, а не для User. Следовательно, я попробовал преобразование, используя приведенную ниже концепцию, что все в java является объектом, но все же дает RuntimeException ClassCastException:

User u = new User(12,"johnson","pam",new Date());
Object o = u;
Employee e=(Employee)o;

Есть ли другой способ решить эту проблему? Нет возможности изменить существующую иерархию классов или включить какую-либо дополнительную структуру наследования.

вы не можете перекинуть один объект на другой.

Vishwa Ratna 16.01.2019 05:51
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
223
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы не можете преобразовать объект user в объект employee, поскольку они не имеют никакого отношения. У вас должен быть класс Mapper, который будет отображать объект User в объект Employee.

class UserToEmployee{
   public Employee map(User user){
       Employee e = new Employee();
       e.setUserId(user.getUserId());
       // so on set all the required properties
      return e;
    }
}

Затем используйте это как:

User u = new User(12,"johnson","pam",new Date());
UserToEmployee mapper = new UserToEmployee();
Employee e = mapper.map(u)

разве нет лучшего способа ?? Кстати, мне нравится твой путь.

Vishwa Ratna 16.01.2019 05:50

Способов сделать работу может быть очень много. Но я использовал этот способ в своем проекте много раз, так как он дает возможность внедрить объект UserToEmployee с помощью DI.

Amit Bera 16.01.2019 07:28
Ответ принят как подходящий

Вы вообще не можете преобразовывать объекты в Java. Вы можете привести ссылку к типу, реализованному указанным объектом.

Что вы можете сделать, так это конвертировать от одного объекта к новому объекту. Если вы не можете изменить классы, вы можете написать внешний конвертер. Например:

public class EmployeeFactory {
    public static Employee toEmployee( User user ) {
        Employee emp = new Employee();
        emp.setUserId( user.getUserId() );
        emp.setUserName( user.getUserName());
        return emp;
    }
}

не думаете ли вы, что есть простой способ составить карту? Кстати, отличный ответ, простой :)

Vishwa Ratna 16.01.2019 05:51

Поскольку Employee и User - это совершенно два разных объекта, поэтому вы не можете использовать его как ваш корпус.

Простой пример

Пользователь

public class User {

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

}

Наемный рабочий

public class Employee extends User {
    //constructor
}

Тогда ты сможешь это сделать

Employee e = new Employee();
Object o = e;
User = (Employee) o;

Конечно, в этом случае вы не может поступаете наоборот: преобразуете User в Employee

Надеюсь, этот небольшой пример поможет вам лучше понять суть дела.

В java простой способ думать о кастинге объектов: «Я лгу?» Т.е. если я передаю User в Employee, я говорю, что User является сотрудником. Я вру? Если так, то гипс подойдет. Если нет, то не будет. Теперь, согласно вашей логике, вы хотите, чтобы все сотрудники были пользователями. Чтобы установить отношения "есть", вы можете использовать слово "расширяет"

class User{
//Your things
}
class Employee extends User{
//More employee-specific things
}

Теперь, если ты это сделаешь

User john=new User(//args);

Ты можешь сделать

if (john instanceof Employee){//Make sure john is an employee
Employee johnEmployee=(Employee)john
}

Все кастинг - это перемаркировка объекта. Но вы не можете лгать ни о чем, что не установлено, когда объект создан.

Другие вопросы по теме