2017-01-23 77 views
1

我正在与Kotlin一起探索使用BDB JE(Berkeley DB Java Edition)。 BDB的知识不需要回答这个问题。在Kotlin中,如何使用本地java参数实例化泛型类?

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>我得到以下错误:

Type inference failed: Expected type mismatch: Inferred type is PrimaryIndex<TModel!, TKey!>! but PrimaryIndex<TModel, TKey> was expected.

我问题:我可以通过索引ModelStore吗?我如何说服类型系统这是犹太教?

+0

什么是'getIndex'的返回类型? – hotkey

+0

@hotkey:PrimaryIndex ! –

+0

这也重现了错误:'val用户:PrimaryIndex = store.getPrimaryIndex(Int :: class.java,“Int”,User :: class.java,“User”)' –

回答

2

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

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

此外,我希望它在不指定工种:

ModelStore(getIndex<User, Int>()) 
+1

谢谢!这两种方法都起作用 - 我没有意识到你可以将类型参数从类构造函数中去除。我习惯于C#,可以派生函数类型参数,但不能使用类参数。无论如何,我已经明确施放,因为我宁愿没有传播平台类型。 –

相关问题