我不太理解为什么会出现这样的问题。
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] 类型推断失败。类型参数T的值应该在输入类型(参数类型、接收器类型或期望类型)中提到。尝试显式地指定它。
如果我使用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代码的相似性,这也是我的意图,理解问题本身,而不是寻找替代方法。
@JvmOverloads constructor(outputStreams: List<OutputStream?> = LinkedList())
。通过在问号后面添加符号,可以告诉编译器列表可能包含一个空值。 - Rado