GenericDAO 和 ClassCast
GenericDAO and ClassCast
我已经按照下面的代码编写了以下 GenericDAO
abstract public class DAO <T extends AbstractBusinessObject> {
// CRUD: create, read, update, delete
public abstract T create(Class<T> abObj);
public abstract T read();
public abstract void update(T abObj);
public abstract void delete(T abObj);
}
我还通过命令模式实现了一些命令,这些命令与扩展 GenericDAO 的 DAOInMemory 交互,以执行 "register user name password" 等任务。
public class RegisterUserCommand extends AbstractCommand {
public RegisterUserCommand() {
...
}
...
@Override
public void execute(String[] cmdArgs) {
// class cast here
User userObject = (User) daoInstance.create(User.class);
//why doesn't this work?
//User userObject = daoInstance.create(User.class);
}
}}
我不明白为什么当 DAOInMemory 已经在 create
方法中转换操作时我必须转换 daoInstance.create(User.class)
的结果?
public class DAOInMemory<T extends AbstractBusinessObject> extends DAO<T> {
...
public DAOInMemory() {
...
public T create(Class<T> abstractObjectType) {
IDGenerator IDGenerator = IDGenerator.getInstance();
if (User.class.isAssignableFrom(abstractObjectType)) {
BigInteger id = IDGenerator.getID();
User user = new User(id);
return (T) user;
}
你能解释一下 Java 的这种行为吗?
编辑: 我忘了补充 public class User extends AbstractBusinessObject
您需要投射,因为 T
不一定是 User
。
事实上,此代码可能会导致 class 转换异常,因为您的通用定义是 T extends AbstractBusinessObject
,这并不意味着 User
实例化 DAO 时必须避免使用泛型 class。
示例 1:(需要强制转换):
DAO dao = new DAOInMemory();
User user = (User) dao.create(User.class);
示例 2:(不需要转换):
DAO<User> dao = new DAOInMemory<User>();
User user = dao.create(User.class);
我已经按照下面的代码编写了以下 GenericDAO
abstract public class DAO <T extends AbstractBusinessObject> {
// CRUD: create, read, update, delete
public abstract T create(Class<T> abObj);
public abstract T read();
public abstract void update(T abObj);
public abstract void delete(T abObj);
}
我还通过命令模式实现了一些命令,这些命令与扩展 GenericDAO 的 DAOInMemory 交互,以执行 "register user name password" 等任务。
public class RegisterUserCommand extends AbstractCommand {
public RegisterUserCommand() {
...
}
...
@Override
public void execute(String[] cmdArgs) {
// class cast here
User userObject = (User) daoInstance.create(User.class);
//why doesn't this work?
//User userObject = daoInstance.create(User.class);
}
}}
我不明白为什么当 DAOInMemory 已经在 create
方法中转换操作时我必须转换 daoInstance.create(User.class)
的结果?
public class DAOInMemory<T extends AbstractBusinessObject> extends DAO<T> {
...
public DAOInMemory() {
...
public T create(Class<T> abstractObjectType) {
IDGenerator IDGenerator = IDGenerator.getInstance();
if (User.class.isAssignableFrom(abstractObjectType)) {
BigInteger id = IDGenerator.getID();
User user = new User(id);
return (T) user;
}
你能解释一下 Java 的这种行为吗?
编辑: 我忘了补充 public class User extends AbstractBusinessObject
您需要投射,因为 T
不一定是 User
。
事实上,此代码可能会导致 class 转换异常,因为您的通用定义是 T extends AbstractBusinessObject
,这并不意味着 User
实例化 DAO 时必须避免使用泛型 class。
示例 1:(需要强制转换):
DAO dao = new DAOInMemory();
User user = (User) dao.create(User.class);
示例 2:(不需要转换):
DAO<User> dao = new DAOInMemory<User>();
User user = dao.create(User.class);