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.

  • ¿Cuál es la forma correcta de agregar un getter privado abstracto y un setter público?
  • RxJava salida diferente entre Flowable y Observable con window y Groupby
  • Cómo usar el envoltorio MailChimp escrito por Kotlin en el Proyecto Java
  • suprimir una advertencia de variable no utilizada
  • División de routes en múltiples files
  • ¿Cómo comparo un Corto con un Int en Kotlin?
  • Diferentes posiciones de destino cuando se usan diferentes tamaños de vista con ObjectAnimator
  • Elimina getters y setters del código de kotlin
  • ClassNotFoundException en comstackciones posteriores después de convertir MainActivity a Kotlin
  • Clase de datos de Kotlin: ¿cómo leer el valor de la propiedad si no sé su nombre en el momento de la compilation?
  • Cómo devolver una interfaz como javawith Kotlin