私は学ぶことが私のデータベースのための私自身のリポジトリを作成しようとしていますので、私はこのような何かしようとしています:私はDatabaseObjectを拡張する多くのクラスを持っている、と私は構築することができるようにしたい言い換えればジェネリック型のコンストラクタをコールしますか?
@Override
public <T extends DatabaseObject> List<T> getList() {
Cursor cursor = getCursor(somehowGetClassOfT(), null, null); //how to do this?
//excess code removed, rest of function not relevant to question
return list;
}
protected <T extends DatabaseObject> Cursor getCursor(Class<T> clazz, String selection, String[] selectionArgs) {
DatabaseObject databaseObject = instantiateFromT(clazz); //how to do this?
String tableName = databaseObject.getTableName();
String[] projection = databaseObject.getProjection();
String sortOrder = databaseObject.getDefaultOrderColumn() + " " + DEFAULT_SORT_ORDER;
Cursor cursor = database.query(
tableName,
projection,
selection,
selectionArgs,
null,
null,
sortOrder
);
return cursor;
}
を動的にカーソルを作成します。
テーブル名や列名の文字列配列など、データベースオブジェクトの基本メソッドを定義しましたが、(テーブル名などの)インターフェイスから静的メソッドをオーバーライドできないため、私はゲッターでテーブル名を取得することができます。
しかし、私は実装方法を確認していない:
somehowGetClassOfT()
。T
が何であれ、そのクラスをCursor関数に渡したいと思います。instantiateFromT(clazz)
。いくつかのクラスが与えられたら、そのオブジェクトのテーブル/投影/並べ替えフィールドにアクセスできるようにコンストラクタを呼び出します。
これは、私が聞いてきた「反射」を使用することで可能ですか?
ストレートな方法で
MyRepository
コンストラクタで効果的なジェネリック型を解決するための反射で。私は答えました。 – davidxxx
私は今見ました。すでにSOの助けを借りています。 Great :) – davidxxx
'DogRepository(Class type)'という行は、引数としてクラスを渡す必要がありますか?私。 DogRepositoryは、何らかの理由でDog.classに内部参照があるので、引数を渡すべきではないので、リポジトリが呼び出されるたびに外部から渡される必要はありませんか? –
user7085962