Я знаю, что Realm еще не поддерживает Generics напрямую. Я пытался найти обходной путь, так как он значительно уменьшит количество дублирующегося кода в моем проекте. (У меня есть много репозиториев, которые расширяют базовый репо, и множество функций, которые отличаются только расширенным типом RealmObject)
У меня достаточно хорошее решение:
open class BaseRepository(private val realm: Realm) {
fun <T : RealmModel> get(ofType: Class<T>, id: Long): T? {
return realm.where(ofType).equalTo("id", id).findFirst()
}
}
Это может вызываться моими репозиториями, которые наследуются от BaseRepository следующим образом:
customRepository.get(CustomType::class.java, id)
Я попытался улучшить это, передав тип класса в конструктор вместо функции param:
open class BaseRepository<T : RealmModel?>(private val realm: Realm, private val ofType: Class<T>) {
fun <T : RealmModel> get(id: Long): T? {
return realm.where(ofType).equalTo("id", id).findFirst()
}
}
Выше есть следующая ошибка времени компиляции:
Type mismatch.
Required: T#1 (type parameter of com.acme.data.repository.BaseRepository.get)?
Found: T#2 (type parameter of com.acme.data.repository.BaseRepository)?
Я предпринял несколько попыток заставить это работать, но пока я безуспешно.
Вопросы:
Почему я не могу передать ofType: Class в параметре конструктора, а могу в параметре функции?
Кто-нибудь знает, как это исправить?
Есть ли какая-либо проблема, Царство или нет, с тем, что я делаю, поскольку это, кажется, работает, и все мои тесты все еще проходят?
Кто-нибудь получил лучшее решение для этого, например, используя методы расширения kotlin?
Спасибо,
Пол.