Я новичок в 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;
Есть ли другой способ решить эту проблему? Нет возможности изменить существующую иерархию классов или включить какую-либо дополнительную структуру наследования.




Вы не можете преобразовать объект 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)
разве нет лучшего способа ?? Кстати, мне нравится твой путь.
Способов сделать работу может быть очень много. Но я использовал этот способ в своем проекте много раз, так как он дает возможность внедрить объект UserToEmployee с помощью DI.
Вы вообще не можете преобразовывать объекты в Java. Вы можете привести ссылку к типу, реализованному указанным объектом.
Что вы можете сделать, так это конвертировать от одного объекта к новому объекту. Если вы не можете изменить классы, вы можете написать внешний конвертер. Например:
public class EmployeeFactory {
public static Employee toEmployee( User user ) {
Employee emp = new Employee();
emp.setUserId( user.getUserId() );
emp.setUserName( user.getUserName());
return emp;
}
}
не думаете ли вы, что есть простой способ составить карту? Кстати, отличный ответ, простой :)
Поскольку 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
}
Все кастинг - это перемаркировка объекта. Но вы не можете лгать ни о чем, что не установлено, когда объект создан.
вы не можете перекинуть один объект на другой.