Chcę napisać funkcję, która zwraca każdą pozycję w pozycji, List
która nie jest pierwszą ani ostatnią pozycją (punkt pośredni). Funkcja pobiera dane ogólne List<*>
jako dane wejściowe. Wynik powinien zostać zwrócony tylko wtedy, gdy elementy listy są typu 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}
}
Podczas przesyłania List<*>
do List<Waypoint>
, otrzymuję ostrzeżenie:
Niezaznaczone Cast: kotlin.collections.List to kotlin.colletions.List
Nie mogę znaleźć innego sposobu, aby to zaimplementować. Jaki jest właściwy sposób implementacji tej funkcji bez tego ostrzeżenia?
filterIsInstance
a oryginalna lista zawiera elementy innego typu, kod po cichu je odfiltruje. Czasami tego chcesz, ale czasami woliszIllegalStateException
rzucić coś podobnego. Jeśli tak jest później, możesz utworzyć własną metodę sprawdzenia, a następnieinline fun <reified R> Iterable<*>.mapAsInstance() = map { it.apply { check(this is R) } as R }
.apply
nie zwraca wartości zwracanej przez lambdę, ale zwraca obiekt odbierania. Prawdopodobnie chcesz użyć,.takeIf
jeśli chcesz, aby opcja zwracała wartość null.Aby poprawić odpowiedź @ hotkey, oto moje rozwiązanie:
To daje ci,
List<Waypoint>
czy wszystkie przedmioty mogą być rzucone, w przeciwnym razie null.źródło
W przypadku klas generycznych rzutowania nie można sprawdzić, ponieważ informacje o typie są usuwane w czasie wykonywania. Ale sprawdzasz, czy wszystkie obiekty na liście to
Waypoint
s, więc możesz po prostu wyłączyć ostrzeżenie za pomocą@Suppress("UNCHECKED_CAST")
.Aby uniknąć takich ostrzeżeń, musisz przekazać
List
obiekt, na który można zamienićWaypoint
. Kiedy używasz,*
ale próbujesz uzyskać dostęp do tej listy jako listy wpisanej, zawsze będziesz potrzebować obsady, a ta obsada będzie odznaczona.źródło
Zrobiłem małą różnicę w odpowiedzi @hotkey, gdy używam jej do sprawdzania obiektów Serializable to List:
źródło
Cannot access 'Serializable': it is internal in 'kotlin.io'
Zamiast
lubię robić
Nie jestem pewien, jak wydajne jest to, ale przynajmniej bez ostrzeżeń.
źródło