0

我可能是个白痴,但我一直无法弄清楚这一点。我正在尝试为带有数据库的简单 CRUD 框架设置一些类。

我从一个Entity接口和一个Users implements Entity类开始。

然后作为“dao”类,我有一个接口

GenericTableModel<T extends Entity>

使用通常的功能,然后是抽象类

AbstractTableModel<T extends Entity> implements GenericTableModel<T>

它实现了常见的功能,例如List<T> listAll(), 最后是

UsersTable extends AbstractTableModel<Users> implements GenericTableModel<Users>

这些是构造函数

AbstractTableModel( Class<T> classType ){ this.type = classType; } and
UsersTable() { super( Users.class ); }

所以下面的代码按预期工作:listAll()方法 inAsbtractTableModel被调用,魔法发生,我得到一个Users对象列表。

UsersTable ut = new UsersTable();
List<Users> usrLst = ut.listAll();

但是,当我添加以下类时,情况会发生变化:

public abstract class AbstractCrud<T extends GenericTableModel> {
    private T table;

    public AbstractCrud( T t ){ this.table = t }

    public List<? extends Entity> getList(){
        return this.table.listAll()
    }

public class UserSimpleCrud extends AbstractCrud {
    public UserSimpleCrud()
    {
        super( new UsersTable() );
    }

super.getList()不返回一个列表Users,只是一个List对象。为了获得Users我需要以下方法的列表UserSimpleCrud

    @Override
    public List<Users> getList(){
        return super.getList();
    }

这将自动将对象列表转换为Users.

Sooo....我在这里想念什么?很明显,除了几个灰色的细胞!;-)

为什么listAll()方法 inAsbtractTableModel能够将列表转换为UsersgetList()inAbstractCrud不能?

4

2 回答 2

3

你可以试试这个

public abstract class AbstractCrud<T extends Entity> {
    private GenericTableModel<T> table;

    public AbstractCrud( GenericTableModel<T> table ){ this.table = table }

    public List<T> getList(){
        return this.table.listAll()
    }



public class UserSimpleCrud extends AbstractCrud<User> {
    public UserSimpleCrud(){
        super( new UsersTable() );
    }
于 2013-11-15T00:08:39.380 回答
0

如果我是自己编写而不是使用 Spring Data(它在这些类型的情况下对我很有帮助),我会做类似的事情:

public abstract class AbstractCrud<T extends GenericTableModel, E extends Entity> {
    private T table;

    public AbstractCrud( T t ){ this.table = t }

    public List<E> getList(){
        return this.table.listAll()
    }
}

从那里,

public class UserSimpleCrud extends AbstractCrud<GenericTableModel<User>, User> {
    public UserSimpleCrud()
    {
        super( new UsersTable() );
    }
}

应该给你你正在寻找的东西。这不是我的想法,但我认为它对你有用。

于 2013-11-15T00:09:39.643 回答