Estoy teniendo problemas para entender por qué
class Main {
private val outputStreams: List<OutputStream>
@JvmOverloads constructor(outputStreams: List<OutputStream> = LinkedList()) {
if(outputStreams.contains(null)) {
throw IllegalArgumentException("outputStreams mustn't contain null")
}
this.outputStreams = outputStreams
}
}
hace que el error de compilación ...Main.kt:[12,26] Type inference failed. The value of the type parameter T should be mentioned in input types (argument types, receiver type or expected type). Try to specify it explicitly.
.
Si utilizo outputStreams.contains(null as OutputStream))
la compilación tiene éxito, pero Main(LinkedList<OutputStream>())
falla en tiempo de ejecución debido a las
kotlin.TypeCastException: null cannot be cast to non-null type java.io.OutputStream
at kotlinn.collection.contains.nulll.check.Main.<init>(Main.kt:12)
at kotlinn.collection.contains.nulll.check.MainTest.testInit(MainTest.kt:13)
Lo que me deja con ningún otro método para mantener el código lo más cerca posible de Java original como sea posible, que es mi intención, así como la comprensión de este tema, ya que es en lugar de buscar una solución.
Para el compilador, el parámetro outputStreams
no puede contener null
como su tipo está List<OutputStream>
en oposición a List<OutputStream?>
. El sistema de tipos no espera null
estar dentro de esta lista, por lo tanto no hay necesidad de comprobarlo.
Por otro lado , SI ese parámetro en realidad podría contener null
(ya que proviene de una persona que llama Java) que debe marcarlo como explícitamente anulable:List<OutputStream?>