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.

  • Kotlin / Java forma funcional e inmutable de recostackr un map en un map
  • ¿Por qué Kotlin usa la palabra "val" para representar constante?
  • En Kotlin, ¿cómo agrego methods de extensión a otra class, pero solo visibles en un context determinado?
  • No se pudo get la propiedad desconocida 'anko_version' para el object de tipo ...?
  • Clase abstracta Kotlin java IllegalAccessError
  • Copia defensiva de una colección mutable en la class de datos Kotlin
  • Verificación nula en caso de condiciones
  • Kotlin sigue diciendo que mi tipo de devolución está mal
  • La aplicación de enum consiste en 3 adaptadores entre 2 actividades en Kotlin
  • ¿Cómo obtengo la finalización del código IntelliJ IDEA para importar methods estáticos de Java como funciones de nivel superior de Kotlin?
  • Creación de mockito mockito dentro de la creación simulada