Falló la inferencia del tipo de Kotlin: no coincide el tipo "matriz encontrada <*?>, Matriz obligatoria <*>?"

Estoy encontrando un problema con el sistema de types de Kotlin. Declaré la variable como abajo en el scope de la class:

var planets: ArrayList<Planet>? = null 

y en el constructor trato de inicializar la matriz pero encuentro un error de desajuste de tipo:

 planets = arrayListOf(earth, mars, saturn, jupiter, uranus, neptune, pluto) 

error:

 Requinetworking: ArrayList<Planet>? Found: ArrayList<Planet?> 

¿Por qué recibo este error y cómo lo soluciono?

Al less uno de los planetas ( earth, mars, saturn, jupiter, uranus, neptune, pluto ) es de tipo nulable Planet? de ahí que el tipo inferido de arrayListOf(earth, ...) es ArrayList<Planet?> .

Como ArrayList<Planet> no es contravariante en el tipo Planet , no se puede asignar de forma segura el valor ArrayList<Planet?> .

Para resolver el problema, puede:

  • asegúrate de que todos los planetas no sean de tipo nulo. Planet
  • si lo anterior no es factible cambiar

     var planets: ArrayList<Planet>? = null 

    a

     var planets = arrayListOf<Planet?>() 
  • filtra null planetas null y luego asigna las collections de resultados a los planets :

     planets = arrayListOf(*arrayListOf(earth, ...).filterNotNull().toTypedArray()) 

Otra forma de hacer feliz al comstackdor es hacer que los planets contravariantes de esta manera:

 var planets: ArrayList<in Planet>? = null 

PD. Utilice los types de colección de kotlin List<T> , Set<T> y listOf correspondiente, setOf lugar de las contrapartes de Java siempre que sea posible.

Sus planetas en la list tienen tipo Planet? , no Planet . Por favor, míralo.

Para solucionarlo, existen tres forms:
1. Cambia el tipo de planetas a Planet .
2. Cambiar la definición de la list a

 var planets: ArrayList<Planet?>? = null 

3. Mapa de planetas existentes si está seguro de que no son nulos

 planets = ArrayList(listOf(earth, ... ).map { it!! }) // or safer way planets = ArrayList(listOf(earth, ... ).filterNotNull()) 

El número 2 es el peor, prefiero el número 1, si es imposible, el número 3 como solución alternativa.

  • IntelliJ IDEA no pudo encontrar org.jetbrains.kotlin: kotlin-gradle-plugins
  • ¿Cómo debo configurar los dispositivos de testing mutables en Spek?
  • Cómo implementar el repository de interfaz en otro module de proyecto en AndroidStudio usando Dagger2 y Kotlin
  • ¿Por qué la class de file Kotlin no tiene un método cercano?
  • Usar Kotlin en un module de biblioteca sin usarlo en el module de la aplicación
  • No se puede crear una instancia de actividad | Causado por: kotlin.KotlinNullPointerException
  • Error de time de ejecución de Kotlin SAM: NoSuchMethodError: no hay método estático
  • Kotlin recibe el objective de hacer clic en jquery
  • Metadatos no válidos producidos en META-INF al comstackr Kotlin jar con Gradle
  • ¿El file kotlin no admite el diagtwig de flujo escrito por el descuento?
  • RxJava cómo agrupar elementos de una list en Map <Key, List <Value >>