Я пытаюсь создать набор поставщиков для объектов сферы. Вот пример структуры я пытался построить:Наследование родословной Kotlin - несоответствие типа
Интерфейс:
interface IDataProvider<out T : RealmObject> {
fun getRealmObject(): T
}
Базовый класс поставщика с функцией компаньона для поставщика типизированных конкретизации:
open abstract class BaseProvider<out T : RealmObject> constructor(protected val context: Context?) : IDataProvider<T> {
companion object {
fun <T : RealmObject, E : BaseProvider<T>> create(context: Context?): E {
if (something) {
return SomeChildProviderProvider(context)
} else {
throw TypeNotSupportedException()
}
}
}
}
А вот ребенок класс :
class SomeChildProvider(context: Context?) : BaseProvider<ChildRealmModel>(context){
override fun getRealmObject(): ChildRealmModel {
throw UnsupportedOperationException("not implemented")
}
}
Проблема У меня есть на линии
return SomeChildProviderProvider(context)
Несоответствие типа. Обязательно: E. Найдено: SomeChildProvider.
Я не могу понять, почему он не видит, что E на самом деле является SomeChildProvider. Спасибо.
P.S. Я знаю, что могу отдать это Е, но, на мой взгляд, в этой ситуации это не нужно. Может быть, мне не хватает чего-то очевидного здесь или, вероятно, недостатка знаний Котлина.
Update1: После первого ответа, мы поняли, что код выше, не имеет особого смысла, так как мы должны определить тип возвращения поставщика и передать его в метод создания. Первоначальная идея заключалась в том, что метод create возвращает некоторый тип, который является подтипом BaseProvider. Вот изменения, которые я сделал для того, чтобы поддержать первоначальную идею:
IDataProvider
interface IDataProvider {
fun execute(realm: Realm)
fun createModel(realm: Realm): RealmObject
}
BaseProvider
open abstract class BaseProvider constructor(protected val context: Context?) : IDataProvider {
override fun execute(realm: Realm) {
realm.executeTransaction { r ->
createModel(r)
}
}
companion object {
fun create(context: Context?): IDataProvider {
if (something) {
return ChildProvider(context)
} else {
throw TypeNotSupportedException()
}
}
}
}
ChildProvider
class ChildProvider(context: Context?) : BaseProvider(context) {
override fun createModel(realm: Realm): ChildRealmModel {
var realmObject = realm.createObject(ChildRealmModel ::class.java)
//object property initialization
return realmObject
}
}
вызов UI
BaseProvider.create(context).execute(realm)
Хотя метод createModel возвращает RealmObject, экземпляр будет иметь значение ChildRealmModel. Что мне не нравится в этом, так это то, что мы должны проверять тип экземпляра и вводить его, если нам нужна точная модель где-то в другом месте.
Не могли бы вы уточнить, что вас не устраивает? Я не вижу, где вам нужно «проверять тип экземпляра и вводить его, если нам нужна точная модель». – voddan