Ответ 1
Чтобы достичь именно того, что вы хотите, вы можете использовать параметры типа 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