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

Я новичок в 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 с помощью 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 ответа

Решение

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

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

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

Вы не можете разыграть 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)

Так как 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;

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

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

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

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
}

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

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