繁体   English   中英

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

[英]How to cast one object into another

我是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;
}

}

我想将UserEmployee因为在应用程序中,我将使用hibernate3 xml映射方法用于持久化到database的方法之一来接收User对象。 HIbernate映射存在于Employee对象,而不存在于User 因此,我尝试使用以下概念尝试进行转换,即Java中的所有内容都是一个对象,但仍然提供ClassCastException的RuntimeException:

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

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

您根本无法在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 Object。

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)

因为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;

当然,在这种情况下,您不能采取相反的方式:将UserEmployee

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM