在Kotlin中,如何使用本机java参数实例化泛型类?

时间:2017-01-23 12:10:03

标签: generics kotlin

我正在探索与Kotlin一起使用BDB JE(Berkeley DB Java版)。没有必要了解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>,我会收到以下错误:

  

类型推断失败:预期类型不匹配:推断类型为   PrimaryIndex<TModel!, TKey!>!但是PrimaryIndex<TModel, TKey>   预期

我的问题:我可以将索引传递给ModelStore吗?我如何说服类型系统这是犹太人?

1 个答案:

答案 0 :(得分:2)

最简单的解决方法是转换类型:

ModelStore<User, Int>(getIndex<User, Int>() as PrimaryIndex<User, Int>)

此外,我希望它能在不指定类型的情况下工作:

ModelStore(getIndex<User, Int>())
相关问题