使用java泛型的继承未按预期工作

4nkexdtk  于 2021-07-09  发布在  Java
关注(0)|答案(0)|浏览(200)

我正在尝试使用继承和泛型来创建我的应用程序,但它似乎没有按我期望的方式工作。我会告诉你我的意思(tl;医生在下面):

public interface IModel extends Serializable {
    public int save();
    public void update();
    public void delete();
}

// <T> is a JPA annotated entity/class
@SuppressWarnings("serial")
public abstract class Model<T> implements IModel {
    private final Repository<T> _repository;
    protected T _entity;

    public Model(T entity, Repository<T> repository) {
        this._entity = entity;
        this._repository = repository;
    }

    public int save() {
        return _repository.save(_entity);
    }
    ...
}

这是在例如myaccountmodel中实现的,myaccountmodel是一个带有泛型account(jpa实体)的模型,它实现了iaccount。

public class AccountModel extends Model<Account> implements IAccount {
    private static final AccountRepository REPOSITORY = new AccountRepository();

    public AccountModel(Account entity) {
        super(entity, REPOSITORY);
    }
    // Method implementations...
}

我的通用 Repository 看起来像这样:

public abstract class Repository<T> implements Serializable {

    private static SessionFactory SESSION_FACTORY;
    private final Class<T> _repositoryClass;
    private static boolean _initiated = false;

    public Repository(Class<T> repositoryClass) {

        if (!Repository._initiated) 
            setup();

        this._repositoryClass = repositoryClass;
    }

    private void setup() {
        // logics
        Repository._initiated = true;
    }

    public final Model<T> getById(int id) {

        Session session = SESSION_FACTORY.openSession();

        try {
            session.beginTransaction();
            T t = session.get(_repositoryClass, id);
            return new Model<T>(t, this); // As suggested by @Vlad
        }
        finally {
            session.close();
        }
    }
}

此抽象存储库的帐户实现是:

public class AccountRepository extends Repository<Account> {

    public AccountRepository() {
        super(Account.class);
    }

    public Model<Account> getByEmail(String emailAddress) {...}
}

到目前为止,一切正常。但我不能使用 Model<T> 作为一个 TModel .

热释光;博士

我想使用以下代码行: AccountModel account = new AccountRepository().getById(1);AccountModel 继承 Model<Account> 以及 new AccountRepository().getById() 总是回来 Model<Account> 我希望这能奏效,但事实并非如此。
我错过了什么?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题