如何将一个对象转换为另一个对象

4
我是一名Java初学者,现在在公司的应用程序中有以下两个Bean/POJO: 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 {


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 对象,使用的是 hibernate3 xml 映射方法。对于 Employee 对象,存在 HIbernate 映射,但不存在于 User 中。因此,我尝试使用以下概念进行转换:Java 中的所有内容都是对象,但它仍然会产生 ClassCastException 的 RuntimeException:

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

是否有其他方法解决这个问题?没有更改现有类层次结构或包含任何额外继承结构的选项。


你无法将一个对象转换为另一个对象。 - Vishwa Ratna
4个回答

3

在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

2

由于它们之间没有任何关系,因此您无法将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
有很多方法可以完成这项工作。但是我在我的项目中多次使用了这种方式,因为它提供了使用 DI 注入 UserToEmployee 对象的机会。 - Amit Bera

0
因为EmployeeUser是完全不同的对象,所以你不能像你的情况那样进行强制转换。
一个简单的例子: 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
希望这个小例子能帮助你清楚地理解这种情况。

0
在Java中,一个简单的思考对象转换的方法是:“我在撒谎吗?” 例如,如果我将User转换为Employee,那么我就是在说User是一个Employee。我在撒谎吗?如果是,那么转换就会成功。如果不是,那么转换就会失败。现在,根据你的逻辑,你希望所有的Employee都是Users。为了建立一个“is-a”关系,你可以使用“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
}

所有的类型转换都只是重新标记一个对象。但是如果在创建对象时没有确定的内容,就不能对任何内容进行虚假陈述。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接