Нельзя использовать тип T в качестве параметра reified, вместо этого используйте class - PullRequest
0 голосов
/ 20 января 2019
Android Studio 3.4
Kotlin 1.3.10

У меня есть следующий метод, который вызывает findPreferences, чтобы вернуть правильное значение, которое хранится в общих настройках.Однако, поскольку я использую reified, findPreferences выдает мне сообщение об ошибке: Невозможно использовать тип T в качестве параметра reified.

Есть ли в любом случае, я могу заставить это работать?

fun <T: Any> getValue(key: String, defaultValue: T?): T {
    return findPreferences(key, defaultValue)
}

Этометод, который будет возвращать значение на основе ключа

@Suppress("unchecked_cast")
inline fun <reified  T: Any> findPreferences(key: String, defaultValue: T?): T {
    with(sharedPreferences) {
        val result: Any = when(defaultValue) {
            is Boolean -> getBoolean(key, default)
            is Int -> getInt(key, defaultValue)
            is Long -> getLong(key, defaultValue)
            is Float -> getFloat(key, defaultValue)
            is String -> getString(key, defaultValue)
            else -> {
                 throw UnsupportedOperationException("Cannot find preference casting error")
            }
        }
        return result as T
    }
}

Ответы [ 2 ]

0 голосов
/ 24 июня 2019

Я могу опоздать, но вот аккуратная статья об общих предпочтениях. В статье описан код именно того, чего вы хотите достичь. Посмотрите на это.

https://myprogrammingexperiments.wordpress.com/2017/06/04/manipulating-shared-prefs-with-kotlin-just-two-lines-of-code/

0 голосов
/ 20 января 2019

Удалить reified или изменить getValue на inline fun <reified T: Any> getValue....

С reified нам pass a type to this function (https://kotlinlang.org/docs/reference/inline-functions.html#reified-type-parameters). reified требуется, чтобы тип был известен во время компиляциии, очевидно, в getValue.

недостаточно информации о типе.
...