如何将一个对象投射到另一个对象

时间:2019-01-16 03:35:36

标签: java hibernate hibernate-xml-mapping

我是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,因为在应用程序中,我将使用一种用于持久保存到{{1}中的方法之一来接收User对象}使用database xml映射方法。 hibernate3对象存在HIbernate映射,而Employee不存在。因此,我尝试使用以下概念尝试进行转换,即Java中的所有内容都是对象,但仍然提供User的RuntimeException:

ClassCastException

还有其他解决方法吗?没有选择更改现有类层次结构或包括任何其他继承结构的选项。

4 个答案:

答案 0 :(得分:2)

您根本无法使用Java强制转换对象。您可以将引用转换为所引用对象实现的类型。

您可以做的是将一个对象转换为一个新对象。如果您不能修改这些类,则可以编写一个外部转换器。例如:

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

答案 1 :(得分:1)

您不能将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)

答案 2 :(得分:0)

因为EmployeeUser完全是两个不同的对象,所以您不能像情况一样进行投射

一个简单的例子

用户

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

希望这个小例子可以帮助您清楚地了解此案。

答案 3 :(得分:0)

在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
}

所有转换都在重新标记对象。但是,对于任何在创建对象时未建立的内容,您都不能撒谎。