Je veux écrire une fonction qui renvoie chaque élément dans a List
qui n'est pas le premier ou le dernier élément (un point intermédiaire). La fonction obtient un générique List<*>
en entrée. Un résultat ne doit être renvoyé que si les éléments de la liste sont du type 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}
}
Lorsque je lance le List<*>
vers List<Waypoint>
, je reçois l'avertissement:
Diffusion non cochée: kotlin.collections.List vers kotlin.colletions.List
Je ne peux pas trouver un moyen de le mettre en œuvre autrement. Quelle est la bonne façon d'implémenter cette fonction sans cet avertissement?
filterIsInstance
et que la liste d'origine contient des éléments d'un type différent, votre code les filtrera silencieusement. Parfois, c'est ce que vous voulez, mais parfois vous pourriez plutôt avoir unIllegalStateException
jet ou similaire. Si ce dernier est le cas, vous pouvez créer votre propre méthode pour vérifier, puis lancer:inline fun <reified R> Iterable<*>.mapAsInstance() = map { it.apply { check(this is R) } as R }
.apply
ne renvoie pas la valeur de retour du lambda, il renvoie l'objet de réception. Vous voudrez probablement l'utiliser.takeIf
si vous souhaitez que l'option renvoie une valeur nulle.Pour améliorer la réponse de @ hotkey, voici ma solution:
Cela vous donne
List<Waypoint>
si tous les éléments peuvent être castés, null dans le cas contraire.la source
Dans le cas de classes génériques, les casts ne peuvent pas être vérifiés car les informations de type sont effacées lors de l'exécution. Mais vous vérifiez que tous les objets de la liste sont des
Waypoint
s afin que vous puissiez simplement supprimer l'avertissement avec@Suppress("UNCHECKED_CAST")
.Pour éviter de tels avertissements, vous devez passer un
List
des objets convertibles enWaypoint
. Lorsque vous utilisez*
mais essayez d'accéder à cette liste sous forme de liste saisie, vous aurez toujours besoin d'une distribution et cette distribution sera décochée.la source
J'ai fait une petite variation à la réponse @hotkey lorsque je suis utilisé pour vérifier les objets Serializable to List:
la source
Cannot access 'Serializable': it is internal in 'kotlin.io'
Au lieu de
J'aime faire
Je ne sais pas à quel point c'est performant, mais au moins aucun avertissement.
la source