Dadas las siguientes dos listas
val listA = listOf<List<Int>>() val listB = listOf(1, 2, 3)y la siguiente operacion
val listC = listA + listB Estoy agregando una lista con el tipo List<Int> a una lista con el tipo List<List<Int>> . Sin embargo, mi IDE me dice que el tipo de la lista C resultante es List<Any> y no, como esperaba, List<List<Int>> . ¿Alguien podría explicarme por qué?
Eche un vistazo a la lista de todos los operadores plus en kotlin.collections y verá que el que está llamando se resuelve en este:
operator fun <T> Collection<T>.plus( elements: Iterable<T> ): List<T> El compilador se esfuerza mucho por inferir un tipo para T , de modo que la llamada sea válida, y encuentra Any como tal tipo. Después de todo, List<List<Int>> es Collection<Any> y List<Int> también es Iterable<Any> .
Tenga en cuenta que también hay:
operator fun <T> Collection<T>.plus(element: T): List<T> Sin embargo, la resolución de sobrecarga no elige este porque el que toma un Iterable<T> se considera "más específico". Después de todo, se necesita específicamente un Iterable , en lugar de cualquier tipo ( T ), incluido Iterable . Consulte también la sección de justificación de la especificación .
Probablemente debería usar plusElement en su lugar.