Kotlin generics y class nulable tipo

¿Cómo manejo un tipo de class de generics con nulos en Kotlin?

Función de ejemplo con generics:

fun <I> calculateStuff(valueType: Class<I>, defaultValue: I): I { // do some work return defaultValue; } 

Aquí hay una function de llamada (tenga en count el 2 ° parametro de calculateStuff (…))

 fun doStuff() { // works fine! val myVar1 = calculateStuff(String::class.java, "") // FAIL (null is not accepted... Error: "Cannot infer type parameter I in....") val myVar2 = calculateStuff(String::class.java, null) } 

Solución (cambie el tipo de devolución a I? Y valor por defecto a I?):

 fun <I> calculateStuff(valueType: Class<I>, defaultValue: I?): I? { return defaultValue; } 

Método preferido, pero Kotlin no parece ser compatible (nota "String? :: class.java"):

 val myVar2 = calculateStuff(String?::class.java, null) 

Realmente quiero poder enviar el método (calculateStuff (…)) el tipo de devolución, y si puede ser nulo, como el primer parámetro … de esa manera SOLO tengo que anular la verificación del valor de retorno si Paso una class Nullable en el primer param.

¿Es esto posible en Kotlin?

Necesita cambiar la Class<I> a la Class<out I> :

 fun <I> calculateStuff(valueType: Class<out I>, defaultValue: I): I { return defaultValue; } 

También puede hacerlo utilizando parameters de tipo reificado :

 inline fun <reified I> calculateStuff(defaultValue: I): I { // do some work return defaultValue; } 

Uso:

 val myVar1 = calculateStuff("") // myVar1 is String val myVar2 = calculateStuff<String?>(null) // myVar2 is String? 

Como no hay forma de especificar las classs que aceptan nulos como descubriste, tu premisa de limitarlo a la primera variable no es posible.

Lo que es posible es limitarlo mediante la nulabilidad de la segunda variable agregando un segundo parámetro genérico:

 fun <I, NI: I> calculateStuff(valueType: Class<NI>, defaultValue: I): I { // do some work return defaultValue; } 

val myVar2 = calculateStuff(String::class.java, null as String?) ahora se comstackrá.

La razón por la que esto funciona es porque en el sistema de tipo kotlin, T es una subclass de T? por lo tanto, cualquier valor que no admite nulos es un valor aceptable para un tipo que admite nulos.

  • ¿Qué hay de malo en utilizar la inyección de setter para Android ViewModel vs Implementing e Injecting ViewModel.Factory?
  • ¿Cuál es la diferencia entre arrayListOf y mutableListOf, cuál es mejor?
  • Kotlin, Java, multidex, Dagger 2, Butterknife y Realm: transformClassesWithJarMergingForDebug: input duplicada: org / jetbrains / annotations / NotNull.class
  • Firma de tipo para la function Kotlin con parameters pnetworkingeterminados
  • Kotlin y javax.validation.constraints.NotNull
  • Función de extensión Android Studio 3.0 kotlin 'Referencia no resuelta'
  • ¿Por qué Kotlin lanza IllegalArgumentException cuando usa Proxy?
  • no puede resolver la reference a los methods