Alerta Coder #1 – toList() no puede castearse a ArrayList
Hoy hemos tenido un problema, que casi sale a producción, a causa del método toList().
Imaginemos que queremos meter en el bundle de nuestro fragment una lista de Parcelable. Esto no suele ser muy común, pero puede darse el caso de que lo necesites. Sabes que, para ello, los bundles disponen de un método llamado putParcelableArrayList(), que recibe un ArrayList. Pero el parámetro que recibimos es de tipo List. ¿Cómo convertiríamos un List en un ArrayList?
|
1 |
args.putParcelableArrayList(KEY_LIST, data.toList() as ArrayList<MiObjeto>) |
Esto es un error, ya que el método toList(), como su propio nombre indica, devuelve un tipo List, pero no garantiza que la implementación de List que está haciendo sea un ArrayList. De hecho, puede ser de tipo:
EmptyListcuando la lista sobre la que lo llamas no tiene elementos.SingletonList, cuando la lista tiene un único elementoArrayListcuado tiene más de uno.
Y ni EmptyList ni SingletonList son subtipos de ArrayList.
¿Cómo hay que hacerlo?
Pues como se ha hecho de toda la vida: pasándole la lista al constructor de ArrayList.
|
1 |
args.putParcelableArrayList(KEY_LIST, ArrayList(data)) |
¡Y cuidado con que data no sea nulo! Este constructor admite nulos por su platform type, pero si prestamos atención a su implementación, recibir un nulo hará que nuestra aplicación se detenga.



