Quero escrever uma função que retorne todos os itens em um List
que não seja o primeiro ou o último item (um ponto de passagem). A função obtém um genérico List<*>
como entrada. Um resultado só deve ser retornado se os elementos da lista forem do tipo 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}
}
Ao lançar o List<*>
para List<Waypoint>
, recebo o aviso:
Cast desmarcado: kotlin.collections.List to kotlin.colletions.List
Não consigo descobrir uma maneira de implementá-lo de outra forma. Qual é a maneira certa de implementar essa função sem esse aviso?
filterIsInstance
e a lista original contiver elementos de um tipo diferente, seu código os filtrará silenciosamente. Às vezes é isso que você deseja, mas às vezes você pode preferir que umIllegalStateException
ou semelhante seja lançado. Se o último for o caso, você pode criar seu próprio método para verificar e, em seguida, lançar:inline fun <reified R> Iterable<*>.mapAsInstance() = map { it.apply { check(this is R) } as R }
.apply
não retorna o valor de retorno do lambda, ele retorna o objeto de recebimento. Você provavelmente deseja usar.takeIf
se quiser a opção de retornar um valor nulo.Para melhorar a resposta de @ hotkey, aqui está minha solução:
Isso dá a você
List<Waypoint>
se todos os itens podem ser lançados, caso contrário, null.fonte
No caso de classes genéricas, os casts não podem ser verificados porque as informações do tipo são apagadas em tempo de execução. Mas você verifica se todos os objetos na lista são
Waypoint
s para que possa simplesmente suprimir o aviso com@Suppress("UNCHECKED_CAST")
.Para evitar tais avisos, você deve passar uma lista
List
de objetos conversíveis paraWaypoint
. Quando você estiver usando,*
mas tentando acessar esta lista como uma lista digitada, você sempre precisará de um elenco e este elenco estará desmarcado.fonte
Fiz uma pequena variação na resposta @hotkey quando usado para marcar Serializable to List objects:
fonte
Cannot access 'Serializable': it is internal in 'kotlin.io'
Ao invés de
Eu gosto de fazer
Não tenho certeza de como é o desempenho, mas sem avisos, pelo menos.
fonte