Kotlin: cuando expresión con retorno tipo de function

Quiero aprovechar las expresiones y los methods generics de kotlin para simplificar las preferences compartidas api de Android.

En lugar de llamar a getString () y getInt () etc. todo el time, lo que quiero hacer es crear una function de extensión que cambie según el tipo de function devuelto y llamar al método apropiado. Algo como a continuación:

fun <T> ShanetworkingPreferences.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 } 

Por supuesto, no funcionará. Pero, ¿hay alguna solución para usar cuando la expresión para el tipo de retorno de una function? Todas las sugerencias son bienvenidas

Para lograr exactamente lo que desea, puede usar parameters de types reificados . Esto hará que el comstackdor alinee su function en sus sitios de llamadas con T reemplazado con el tipo utilizado en el sitio de llamadas.

La function se vería así:

 @Suppress("IMPLICIT_CAST_TO_ANY") inline operator fun <reified T> ShanetworkingPreferences.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? 

Si get una function de operator , también puede llamarla usando la syntax del operador: prefs[name] .

Las llamadas deberían, por supuesto, proporcionar suficiente información de tipo para que el comstackdor infiera 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