【问题标题】:Kotlin Generics, correct syntax for type parametersKotlin 泛型,类型参数的正确语法
【发布时间】:2020-06-18 21:20:56
【问题描述】:

我有以下类,它基本上从 AWS 获取 JSON 字符串,然后将其转换为数据类的实例...

class SecretsManager(region: String) {
    private val gson = Gson()
    private val smClient = AWSSecretsManagerClientBuilder.standard().withRegion(region).build()

    fun <T> getSecret(id: String): T {
        val req = GetSecretValueRequest().withSecretId(id)
        val json = smClient.getSecretValue(req).getSecretString()
        return gson.fromJson(json, T::class.java)
    }
}

要这样使用...

val myInstance = SecretsManager("eu-west-2").getSecret<MyDataClass>("myId")

目前,我收到一个错误 - 不能使用 'T' 作为具体类型参数。我可以通过将函数标记为 inline 并将 T 标记为 reified 来解决这个问题,但是我无法从函数内部访问私有属性。

在 Kotlin 中执行此操作的最佳方法是什么?

【问题讨论】:

  • 您无法访问类型参数的类,因为它们已被删除。如果您不想使 T 具体化,请接受 Class&lt;T&gt; 作为参数
  • Class参数添加到当前函数fun &lt;T&gt; getSecret(id: String, clazz: Class&lt;T&gt;): T并创建重载函数inline fun &lt;reified T&gt; getSecret(id: String): T = getSecret(id: String, T::class.java)

标签: kotlin


【解决方案1】:

您需要向getSecret 方法添加另一个参数,并且还需要添加一个内联具体化方法才能使其工作。请看下面的代码

class SecretsManager(region: String) {
    private val gson = Gson()
    private val smClient = AWSSecretsManagerClientBuilder.standard().withRegion(region).build()

    fun <T> getSecret(type: Class<T>, id: String): T {
        val req = GetSecretValueRequest().withSecretId(id)
        val json = smClient.getSecretValue(req).getSecretString()
        return gson.fromJson(json, type)
    }

    inline fun <reified T> getSecret(id: String): T = getSecret(T::class.java, id)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多