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:
EmptyList
cuando la lista sobre la que lo llamas no tiene elementos.SingletonList
, cuando la lista tiene un único elementoArrayList
cuado 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.