【发布时间】:2016-01-08 21:20:14
【问题描述】:
我在下面的代码中编写了以下 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 交互,以执行“注册用户名密码”等任务。
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-method 中转换操作时,我必须转换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
【问题讨论】:
-
我猜你来自
.NET- 但在java编码约定中,变量名以小写字母开头(除非它是一个常量,那么应该使用所有大写字母) -
你是如何定义 daoInstance 的?
-
我仍然不确定您要做什么...您使用了太多泛型 :) 为什么要使用泛型类
DAOInMemory然后返回特定类型?我建议您创建一个UserDAO类,而不是实现DAO<User>或扩展DAOInMemory<User>类以进行实际实现。 -
@IanMc 好吧,实例化只是
DAO daoInstance = new DAOInMemory()在注册所有命令的类的顶部RegisterUserCommand;RegisterUserCommand的构造函数是public RegisterUserCommand(DAO daoInstance) { super(daoInstance); } -
有趣的是(展示了泛型的强大功能),您不需要告诉我们 User 扩展了 AbstractBusinessObject。使用:abstract public class DAO
强制!