2

我是 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用于持久化到databaseusing hibernate3xml 映射方法的方法之一中接收对象。HIbernate映射存在于Employee对象而不是User. 因此,我尝试使用以下概念进行转换,即 java 中的所有内容都是一个对象,但它仍然给出 RuntimeException ClassCastException

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

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

4

4 回答 4

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;
    }
}
于 2019-01-16T03:42:09.180 回答
1

您不能将user对象转换为employee对象,因为它们没有任何关系。您应该有一些Mapper将对象映射UserEmployee对象的类。

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)
于 2019-01-16T03:41:57.493 回答
0

因为EmployeeandUser是完全不同的两个对象,所以你不能像你的情况一样投射

一个简单的例子

用户

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 UsertoEmployee

希望这个小例子能帮助你清楚地了解这个案例。

于 2019-01-16T03:48:35.777 回答
0

在 Java 中,考虑转换对象的一种简单方法是:“我在撒谎吗?” 即,如果我将用户转换为员工,我说用户是员工。我在撒谎吗?如果是这样,演员阵容将起作用。如果没有,那就不会了。现在,根据您的逻辑,您希望所有员工都是用户。要建立“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
}

所有的铸造都是重新标记一个对象。但是你不能对任何在制作对象时尚未确定的事情撒谎。

于 2019-01-16T04:35:27.393 回答