Staram się aby moje własne repozytorium dla mojej bazy danych, aby dowiedzieć się, więc próbuję coś takiego:Wywołanie konstruktora typu generycznego?
@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;
}
Innymi słowy Mam wiele klas, które rozszerzają DatabaseObject i chcę, aby być w stanie budować kursor dla nich dynamicznie.
Zdefiniowałem podstawowe metody w DatabaseObject, takie jak uzyskanie nazwy tabeli, Tablica ciągów nazw kolumn itp., Ale ponieważ nie mogę przesłonić statycznych metod przez interfejs (w przypadku rzeczy takich jak nazwa tabeli), muszę utworzyć instancję pusty obiekt, więc mogę uzyskać nazwę tabeli z geterem.
Jednak nie jestem pewien, jak wdrożyć:
somehowGetClassOfT()
. Niezależnie od tego, czy jest toT
, chcę przekazać tę klasę do funkcji kursora.instantiateFromT(clazz)
. Biorąc pod uwagę klasę, wywołaj konstruktora, aby uzyskać dostęp do pól tabeli/projekcji/sortowania tego obiektu.
Czy to wszystko jest możliwe dzięki "odbiciu", o którym słyszałem?
w prosty sposób. Odpowiedziałam. – davidxxx
Właśnie widziałem. Już pomógł SO. Świetnie :) – davidxxx
Linia 'DogRepository (klasa)', czy konieczne jest przekazanie klasy jako argumentu? To znaczy. czy DogRepository nie ma wewnętrznego odwołania do Dog.class, aby przekazać argument, więc nie musi być przekazywany z zewnątrz za każdym razem, gdy wywoływane jest repozytorium? –
user7085962