Я изучаю использование BDB JE (Berkeley DB Java Edition) с Kotlin. Знание BDB не обязательно для ответа на этот вопрос.
У BDB есть метод, который выглядит так:
store.getPrimaryIndex(Int::class.java, "Int", Person::class.java, "Person")
Я хочу делать вещи в целом, поэтому я написал это
inline fun <reified TModel : Any, reified TKey : Any> getIndex() = return store.getPrimaryIndex(TKey::class.java, TKey::class.simpleName, TModel::class.java, Model::class.simpleName)
Все идет нормально. Теперь я хочу передать этот индексный объект классу, который выглядит так:
class ModelStore<TModel, TKey>(index : PrimaryIndex<TKey, TModel>) { private val index = index fun get(key : TKey): TModel = index.get(key) fun put(model : TModel) = index.put(model) }
Но если я попытаюсь передать вывод из getIndex<User, Int>()
в ModelStore<User, Int>
я получаю следующую ошибку:
Ошибка вывода типа: ожидаемое несоответствие типа: тип Inferred –
PrimaryIndex<TModel!, TKey!>!
ноPrimaryIndex<TModel, TKey>
.
Мой вопрос: могу ли я передать индекс в ModelStore
? Как мне убедить систему типов, что это кошерная?
Простейшим обходным путем является использование типов:
ModelStore<User, Int>(getIndex<User, Int>() as PrimaryIndex<User, Int>)
Также я бы ожидал, что он будет работать без указания типов:
ModelStore(getIndex<User, Int>())