Я хочу написать функцию, которая возвращает каждый элемент в a, List
который не является первым или последним элементом (промежуточной точкой). Функция получает в 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}
}
При приведении List<*>
к List<Waypoint>
я получаю предупреждение:
Не отмечено флажком Приведение: kotlin.collections.List в kotlin.colletions.List
Я не могу придумать, как это реализовать иначе. Как правильно реализовать эту функцию без этого предупреждения?
filterIsInstance
а исходный список содержит элементы другого типа, ваш код автоматически отфильтрует их. Иногда это то, что вам нужно, но иногда вы можете получить такой жеIllegalStateException
или подобный бросок. В последнем случае вы можете создать свой собственный метод для проверки, а затемinline fun <reified R> Iterable<*>.mapAsInstance() = map { it.apply { check(this is R) } as R }
.apply
лямбда не возвращает возвращаемое значение, а возвращает полученный объект. Вы, вероятно, захотите использовать,.takeIf
если хотите, чтобы опция возвращала нуль.Чтобы улучшить ответ @ hotkey, вот мое решение:
Это дает вам,
List<Waypoint>
если все элементы могут быть применены, в противном случае - null.источник
В случае общих классов приведения не могут быть проверены, потому что информация о типе стирается во время выполнения. Но вы проверяете, что все объекты в списке имеют
Waypoint
s, поэтому вы можете просто подавить предупреждение с помощью@Suppress("UNCHECKED_CAST")
.Чтобы избежать таких предупреждений, вы должны передать
List
объект, в который можно преобразоватьWaypoint
. Когда вы используете,*
но пытаетесь получить доступ к этому списку как к типизированному списку, вам всегда потребуется приведение, и это приведение не будет отмечено.источник
Я немного изменил ответ @hotkey, когда он использовался для проверки объектов Serializable to List:
источник
Cannot access 'Serializable': it is internal in 'kotlin.io'
Вместо того
Мне нравится делать
Не уверен, насколько это эффективно, но по крайней мере никаких предупреждений.
источник