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

时间:2018-02-15 16:18:46

标签: 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
    }
}

但是我收到了这个错误:

  

不能使用&#39; T&#39;作为具体型参数

我可以使用另一个vaultQuery函数,它将Class<T>替换为参数,但我需要首先从VaultRepository<T>获取它。

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

1 个答案:

答案 0 :(得分:7)

我的首选解决方案是向主构造函数添加Class<T>参数,以及从Class获取reified 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)

预测一个特定的评论:有些人认为fun不应该看起来像构造函数。 enter image description here