Ich möchte eine Funktion schreiben, die jedes Element in einem zurückgibt List
, das nicht das erste oder das letzte Element ist (ein Durchkontaktpunkt). Die Funktion erhält eine generische List<*>
Eingabe. Ein Ergebnis sollte nur zurückgegeben werden, wenn die Elemente der Liste vom Typ sind 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}
}
Wenn das Gießen List<*>
auf List<Waypoint>
, erhalte ich die Warnung:
Deaktivierte Besetzung: kotlin.collections.List to kotlin.colletions.List
Ich kann keinen Weg finden, es anders umzusetzen. Was ist der richtige Weg, um diese Funktion ohne diese Warnung zu implementieren?
filterIsInstance
Ihr Code sie stillschweigend herausfiltert , wenn Sie Elemente eines anderen Typs verwenden und die ursprüngliche Liste enthält. Manchmal ist es das, was Sie wollen, aber manchmal möchten Sie lieber einenIllegalStateException
oder einen ähnlichen Wurf haben. Wenn dasinline fun <reified R> Iterable<*>.mapAsInstance() = map { it.apply { check(this is R) } as R }
.apply
der Rückgabewert des Lambda nicht zurückgegeben wird, sondern das Empfangsobjekt. Sie möchten wahrscheinlich verwenden,.takeIf
wenn die Option eine Null zurückgeben soll.Um die Antwort von @ hotkey zu verbessern, ist hier meine Lösung:
Dies gibt Ihnen an,
List<Waypoint>
ob alle Gegenstände gewirkt werden können, andernfalls null.quelle
Bei generischen Klassen können Casts nicht überprüft werden, da die Typinformationen zur Laufzeit gelöscht werden. Sie überprüfen jedoch, ob alle Objekte in der Liste
Waypoint
s sind, sodass Sie die Warnung einfach mit unterdrücken können@Suppress("UNCHECKED_CAST")
.Um solche Warnungen zu vermeiden, müssen Sie ein
List
Objekt übergeben, in das konvertiert werden kannWaypoint
. Wenn Sie*
diese Liste als typisierte Liste verwenden, aber versuchen, darauf zuzugreifen, benötigen Sie immer eine Besetzung, und diese Besetzung wird deaktiviert.quelle
Ich habe eine kleine Änderung an @hotkey answer vorgenommen, als ich die Option Serializable to List-Objekte verwendet habe:
quelle
Cannot access 'Serializable': it is internal in 'kotlin.io'
Anstatt
Ich mache gerne
Ich bin mir nicht sicher, wie performant dies ist, aber zumindest keine Warnungen.
quelle