以下函数获取一个Serializable
的列表和一个lambda,用于序列化列表中的各个元素。
val os = BufferOutputStream()
fun <T : Serializable> writeList(list: List<Serializable>, emitter: (T, BufferOutputStream) -> Unit) {
os.writeInt(list.size)
for (v in list) { // v is of type Serializable
emitter(v as T, os) // why do we need to cast V as T?
}
}
当v
已经必须实现Serializable
时,为什么需要将类型为T
的{{1}}强制转换为T
? Serializable
是否确定采用<T : Serializable>
的函数/ lambda必须采用Serializable
?
答案 0 :(得分:1)
但是,您的发射器不占用任何Serializable
-仅占用T
。这就是您需要强制转换的原因-列表的元素类型为Serializable
。如果您将其更改为:
val os = BufferOutputStream()
fun <T : Serializable> writeList(list: List<T>, emitter: (T, BufferOutputStream) -> Unit) {
os.writeInt(list.size)
for (v in list) {
emitter(v, os)
}
}
它不需要强制转换。
答案 1 :(得分:0)
我想举个例子,说明为什么不进行强制转换就不能编译它。
想象一下有两个实现或扩展Class1
的类Class2
和Serializable
。如果使用包含Class1
的列表调用此函数,但发射器使用Class2
,则将Class1
移出列表并将其传递到发射器时,它将是类强制转换异常只需Class2
。
在@ r2rek发布的示例中,该函数将列表和发射器强制为相同的类。