一覧はKotlinにヌルが含まれているかどうかを確認する方法は?

カール・リヒター:

私は悩み、なぜ理解を持っています

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?>

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=197420&siteId=1