Котлин – когда выражение с возвращаемым типом функции

Я хочу использовать преимущества kotlin, когда выражения и общие методы упрощают общие настройки api для Android.

Вместо того чтобы постоянно вызывать getString () и getInt () и т. Д., Я хочу создать функцию расширения, которая будет переключаться на основе типа возвращаемого значения и вызвать соответствующий метод. Что-то вроде ниже:

fun <T> SharedPreferences.get(key: String): T? { when (T) { //how do I switch on return type and call appropriate function? is String -> getString(key, null) is Int -> getInt(key, -1) is Boolean -> getBoolean(key, false) is Float -> getFloat(key, -1f) is Long -> getLong(key, -1) } return null } 

Конечно, это не сработает. Но существует ли какое-либо решение для использования выражения для возвращаемого типа функции? Все предложения приветствуются.

Чтобы достичь именно того, что вы хотите, вы можете использовать параметры типа reified . Это заставит компилятор включить вашу функцию на своих сайтах с заменой T на тип, используемый на сайте вызова.

Функция будет выглядеть так:

 @Suppress("IMPLICIT_CAST_TO_ANY") inline operator fun <reified T> SharedPreferences.get(key: String): T? = when (T::class) { String::class -> getString(key, null) Int::class -> getInt(key, -1) Boolean::class -> getBoolean(key, false) Float::class -> getFloat(key, -1f) Long::class -> getLong(key, -1) else -> null } as T? 

Если вы get функцию operator , вы также можете вызвать его с помощью синтаксиса оператора: prefs[name] .

Разумеется, вызовы должны предоставлять достаточную информацию о типе для компилятора для вывода T :

 val i: Int? = prefs["i"] // OK, the type information is taken from the declaration val j: Int = prefs["i"]!! // OK val x = prefs["x"] // Error, not enough type information val y = prefs.get<String>("y") // OK, the type will be `String?` fun f(z: Int) = z f(prefs["z"]!!) // OK, the type information is taken from the parameter type 
Intereting Posts
Kotlin – Как я могу вернуть разные типы из моего метода? Jacoco с gradle и kotlin не создает файл jacoco.exec Как остановить службу уведомления на Android Oreo Создание абстрактного Spek для инициализации общих объектов с помощью Kotlin and Spek Получить запись с максимальным значением с карты в Котлин Реализовать Hashmap с разными типами значений в Котлине Тип вывода с ленивой инициализацией и общим заводским методом в Котлине Kotlin: Как работать со списками: Непроверено В ролях: kotlin.collections.List <Kotlin.Any?> To kotlin.colletions.List <Путевая точка> Загрузка файла и сохранение его для загрузки папки с помощью kotlin в Android Как подавить проверку орфографии на константе строки в Android Kotlin? Классы хранения на языке программирования Kotlin Сделать HTTP-запрос при нажатии кнопки в Kotlin Как использовать библиотеку kmongo для оператора slice Объекты компаньона Котлина и отражение Поддерживает ли Котлин монадическое понимание?