Как бросить один объект в другой
Я новичок в 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
}
Все кастинги это перемаркировка объекта. Но вы не можете лгать ни о чем, что не установлено, когда объект сделан.