我试图在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?
答案 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)