0

私はばかかもしれませんが、これを理解することができませんでした。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が呼び出され、魔法が起こり、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

すっごく....ここで何が欠けていますか?いくつかの灰色の細胞を除いて、明らかに!;-)

メソッドがリストをキャストできるのに、listAll()メソッドができないのはなぜですか?AsbtractTableModelUsersgetList()AbstractCrud

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 に答える