Quiero escribir una función que devuelva todos los elementos de un elemento List
que no sea el primero ni el último (un punto intermedio). La función obtiene un genérico List<*>
como entrada. Solo se debe devolver un resultado si los elementos de la lista son del tipo Waypoint
:
fun getViaPoints(list: List<*>): List<Waypoint>? {
list.forEach { if(it !is Waypoint ) return null }
val waypointList = list as? List<Waypoint> ?: return null
return waypointList.filter{ waypointList.indexOf(it) != 0 && waypointList.indexOf(it) != waypointList.lastIndex}
}
Cuando lanzo el List<*>
to List<Waypoint>
, recibo la advertencia:
Reparto sin marcar: kotlin.collections.List a kotlin.colletions.List
No puedo encontrar la manera de implementarlo de otra manera. ¿Cuál es la forma correcta de implementar esta función sin esta advertencia?
filterIsInstance
y la lista original contiene elementos de un tipo diferente, su código los filtrará silenciosamente. A veces, esto es lo que quieres, pero a veces es posible que prefieras tener unoIllegalStateException
o algo similar. Si el último es el caso, puede crear su propio método para verificar y luego emitir:inline fun <reified R> Iterable<*>.mapAsInstance() = map { it.apply { check(this is R) } as R }
.apply
no devuelve el valor de retorno de la lambda, devuelve el objeto de recepción. Probablemente desee usar.takeIf
si desea que la opción devuelva un valor nulo.Para mejorar la respuesta de @ hotkey, aquí está mi solución:
Esto le da
List<Waypoint>
si todos los elementos se pueden convertir, nulo en caso contrario.fuente
En el caso de clases genéricas, las conversiones no se pueden verificar porque la información de tipo se borra en tiempo de ejecución. Pero verifica que todos los objetos de la lista sean
Waypoint
s para poder suprimir la advertencia con@Suppress("UNCHECKED_CAST")
.Para evitar tales advertencias, debe pasar una serie
List
de objetos convertibles aWaypoint
. Cuando esté usando,*
pero intentando acceder a esta lista como una lista escrita, siempre necesitará un elenco y este elenco no estará marcado.fuente
Hice una pequeña variación en la respuesta de @hotkey cuando se usa para verificar Serializable to List objetos:
fuente
Cannot access 'Serializable': it is internal in 'kotlin.io'
En vez de
me gusta hacer
No estoy seguro de cuán eficiente es esto, pero al menos no hay advertencias.
fuente