Voglio scrivere una funzione che restituisce ogni elemento in un List
che non è il primo o l'ultimo elemento (un punto intermedio). La funzione ottiene come input un generico List<*>
. Un risultato deve essere restituito solo se gli elementi della lista sono del tipo Waypoint
:Kotlin: Come lavorare con cast di lista: Unchecked Cast: kotlin.collections.List <Kotlin.Any?> a kotlin.colletions.List <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}
}
Quando lancia il List<*>
a List<Waypoint>
, ottengo l'avvertimento:
incontrollato Cast: kotlin.collections. Elenco a kotlin.colletions.List
Non riesco a capire un modo per implementarlo altrimenti. Qual è il modo giusto per implementare questa funzione senza questo avviso?
grande risposta! Scelgo la soluzione list.filterIsInstance() perché penso che sia la soluzione più pulita. –
lukle
Si noti che se si utilizza ['filterIsInstance'] (https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/filter-is-instance.html) e l'elenco originale contiene elementi di un tipo diverso il tuo codice li filtrerà silenziosamente. A volte questo è quello che vuoi, ma a volte potresti preferire una "IllegalStateException" o una simile gettata. Se poi è il caso, puoi creare il tuo metodo per controllare e poi trasmettere: 'inline fun Iterable <*> .mapAsInstance() = map {it.apply {check (this is R)} come R}' –
mfulton26
Nota che '.apply' non restituisce il valore di ritorno di lambda, restituisce l'oggetto di ricezione. Probabilmente si vorrà usare '.takeIf' se si desidera che l'opzione restituisca un valore nullo. – bj0