Java Generics&继承:我想要太聪明吗?

时间:2013-11-14 23:55:44

标签: java generics inheritance

我可能是个白痴,但我无法想出这个。我正在尝试为一个带有DB的简单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()中的AsbtractTableModel方法,发生 magic ,并获得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()中的AsbtractTableModel方法能够将列表转换为Users,但getList()中的AbstractCrud无法进行?{/ p>

2 个答案:

答案 0 :(得分: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() );
    }

答案 1 :(得分: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() );
    }
}

应该能得到你想要的东西。这不是我的头脑,但我认为这对你有用。