我是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
还有其他解决方法吗?没有选择更改现有类层次结构或包括任何其他继承结构的选项。
答案 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)
因为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
希望这个小例子可以帮助您清楚地了解此案。
答案 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
}
所有转换都在重新标记对象。但是,对于任何在创建对象时未建立的内容,您都不能撒谎。