Kotlin - 从类泛型类型参数中获取T :: class.java

ser*_*0ne 4 kotlin corda

我正在尝试围绕Corda的保险库建立一个通用的存储库.它应该看起来像这样:

class VaultRepository<out T : ContractState>(private val services: CordaRPCOps) {

    fun getUnconsumedStateByExternalId(externalId: String): T {
        return services.vaultQuery<T>(...).states.single().state.data
    }
}
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

不能使用'T'作为具体类型参数

我可以使用另一个vaultQuery函数,它将一个Class<T>替代作为参数,但我需要能够从头VaultRepository<T>开始获取它.

有没有办法从类泛型类型参数列表中获取T?

Ale*_*nov 7

我去到的解决方案是一个添加Class<T>参数主构造和构造类似功能,获取Classreified T.

class VaultRepository<out T : ContractState>(private val services: CordaRPCOps, private val clazz: Class<T>) {

    fun getUnconsumedStateByExternalId(externalId: String): T {
        return services.vaultQuery(..., clazz).states.single().state.data
    }
}

fun VaultRepository<reified T : ContractState>(services: CordaRPCOps) =
    VaultRepository(services, T::class.java)
Run Code Online (Sandbox Code Playgroud)

预测一个具体的评论:有些人认为funs看起来不应该像构造者.Kotlin团队不同意.