Как бросить один объект в другой - PullRequest
0 голосов
/ 16 января 2019

Я новичок в 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;
}

}

Employee

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 с использованием метода отображения hibernate3 xml , Отображение HIbernate существует для объекта Employee, а не для User. Поэтому я попытался преобразование, используя следующую концепцию, что все в Java является объектом, но все же он дает RuntimeException ClassCastException:

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

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

Ответы [ 4 ]

0 голосов
/ 16 января 2019

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

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
}

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

0 голосов
/ 16 января 2019

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

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

public class EmployeeFactory {
    public static Employee toEmployee( User user ) {
        Employee emp = new Employee();
        emp.setUserId( user.getUserId() );
        emp.setUserName( user.getUserName());
        return emp;
    }
}
0 голосов
/ 16 января 2019

Потому что 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;
    }

}

Employee

public class Employee extends User {
    //constructor
}

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

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

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

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

0 голосов
/ 16 января 2019

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

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...