배우고 내 데이터베이스에 대한 내 자신의 저장소를 만들려고 노력하고, 그래서 이런 식으로 뭔가 시도하고있다 : 즉제네릭 형식의 생성자를 호출합니까?
@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;
}
내가 DatabaseObject을 확장하는 많은 클래스가 있고, 내가 만들 수 있도록하려면를 동적으로 커서를 표시합니다.
테이블 이름, 문자열 이름의 문자열 배열 등을 가져 오는 것과 같이 DatabaseObject에서 기본 메서드를 정의했지만 테이블 이름과 같은 인터페이스를 통해 정적 메서드를 재정의 할 수 없으므로 예제를 인스턴스화해야합니다. 빈 개체 그래서 나는 getter와 테이블 이름을 얻을 수 있습니다.
그러나, 나는 구현하는 방법을하지 확신 :
somehowGetClassOfT()
.T
이 무엇이든, 그 클래스를 Cursor 함수에 전달하려고합니다.instantiateFromT(clazz)
. 어떤 클래스를 감안할 때 생성자를 호출하면 해당 객체의 테이블/프로젝션/정렬 필드에 액세스 할 수 있습니다.
또는 내가 들었던 "반사"를 사용하면이 모든 것이 가능합니까?
직선 방식이다. 나는 대답했다. – davidxxx
방금 보았습니다. 이미 SO의 도움을 받았습니다. Great : – davidxxx
'DogRepository (Class type)'행은 인수로 클래스를 전달해야합니까? 나는. DogRepository는 Dog.class에 내부 참조를 가지고있어서 저장소를 호출 할 때마다 외부에서 전달 될 필요가 없도록 인수를 전달해서는 안됩니까? –
user7085962