【问题标题】:Kotlin - get T::class.java from class generic type parameterKotlin - 从类泛型类型参数中获取 T::class.java
【发布时间】:2018-07-26 11:25:18
【问题描述】:

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

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

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

但我收到此错误:

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

我可以使用另一个vaultQuery 函数,它以Class&lt;T&gt; 作为参数,但我需要先从VaultRepository&lt;T&gt; 获取它。

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

【问题讨论】:

  • 该类型参数是否仅与所描述的方法相关?您可以将 T 设置为具体的方法类型参数
  • @s1m0nw1 不,T 在很多方法中都是相关的。我可以让所有方法都采用 T(不是双关语)而不是班级,但我觉得当 T 在整个班级中都相同时,它会适得其反。 - 我猜这要么是困难的要么是不可能的,因为 JVM 的编译时类型擦除? (我来自 C#,CLR 是完全类型感知的,即使涉及 GTP,所以这将是微不足道的)
  • 我在这里Modularising to create a function with variable Types in Kotlin也有类似的问题。你能帮忙吗?

标签: kotlin corda


【解决方案1】:

我的首选解决方案是将Class&lt;T&gt; 参数添加到主构造函数和一个类似构造函数的函数,该函数从reified T 获取Class

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)

预期一个特定的评论:有些人认为funs 不应该看起来像构造函数。 The Kotlin team doesn't agree.

【讨论】:

  • 这是提供所需行为的好方法,尽管我不同意类似构造函数的外观。 ++
  • @s1m0nw1 我是 Scala 统一访问原则的忠实粉丝,这是 Kotlin 进一步扩展它的一个案例。
  • @AlexeyRomanov 我喜欢这个,虽然我确实将类似构造函数的函数移到了companion object 并将其重命名为createRepository
  • 我在这里Modularising to create a function with variable Types in Kotlin也有类似的问题。你能帮忙吗?
猜你喜欢
  • 1970-01-01
  • 2019-02-26
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多