Kotlin - 从 class 泛型类型参数中获取 T::class.java
Kotlin - get T::class.java from class generic type parameter
我正在尝试围绕 Corda 的保险库构建一个通用存储库。它应该看起来像这样:
class VaultRepository<out T : ContractState>(private val services: CordaRPCOps) {
fun getUnconsumedStateByExternalId(externalId: String): T {
return services.vaultQuery<T>(...).states.single().state.data
}
}
但是我得到这个错误:
Cannot use 'T' as reified type parameter
我可以使用另一个 vaultQuery
函数,它使用 Class<T>
作为参数,但我需要先从 VaultRepository<T>
获取它。
有没有办法从 类 泛型类型参数列表中获取 T?
我的 go-to 解决方案是向主构造函数添加一个 Class<T>
参数和一个从 reified T
获取 Class
的 constructor-like 函数。
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
s 不应该看起来像构造函数。 The Kotlin team doesn't agree.
我正在尝试围绕 Corda 的保险库构建一个通用存储库。它应该看起来像这样:
class VaultRepository<out T : ContractState>(private val services: CordaRPCOps) {
fun getUnconsumedStateByExternalId(externalId: String): T {
return services.vaultQuery<T>(...).states.single().state.data
}
}
但是我得到这个错误:
Cannot use 'T' as reified type parameter
我可以使用另一个 vaultQuery
函数,它使用 Class<T>
作为参数,但我需要先从 VaultRepository<T>
获取它。
有没有办法从 类 泛型类型参数列表中获取 T?
我的 go-to 解决方案是向主构造函数添加一个 Class<T>
参数和一个从 reified T
获取 Class
的 constructor-like 函数。
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
s 不应该看起来像构造函数。 The Kotlin team doesn't agree.