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);