カール・リヒター:
私は悩み、なぜ理解を持っています
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
}
}
コンパイルエラーが発生します...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.
。
私が使用している場合はoutputStreams.contains(null as OutputStream))
、コンパイルは成功しますが、Main(LinkedList<OutputStream>())
実行時に失敗が原因
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)
これは私のことではなく、回避策を探すよりも、あるとして、この問題を理解するだけでなく、意図している可能な限り元のJavaに近いようなコードを維持するための無い他のアプローチと葉私を。
s1m0nw1:
コンパイラのために、パラメータがoutputStreams
含まれていないことができnull
、その型がされるList<OutputStream>
ように反対しますList<OutputStream?>
。型システムは期待していませんnull
ので、ノー、それをチェックする必要があり、このリスト、内部であることを。
一方、IFそのパラメータは実際に含まれている可能性がありnull
(これは、Javaの呼び出し側から来ているので)明示的にnullとしてそれをマークする必要があります。List<OutputStream?>