Kotlin Generics, правильный синтаксис для параметров типа - PullRequest
0 голосов
/ 19 июня 2020

У меня есть следующий класс, который в основном получает строку JSON из AWS, а затем преобразует ее в экземпляр класса данных ...

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» в качестве параметра повторного типа . Я могу обойти это, пометив функцию как встроенную, а T как реифицируемую, но тогда я не могу получить доступ к частным атрибутам из самой функции.

Какой лучший способ сделать это в Kotlin?

1 Ответ

1 голос
/ 19 июня 2020

Вам нужно добавить еще один параметр к методу 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...