为什么此具有上限的Kotlin参数类型需要强制转换?

时间:2019-11-06 07:31:30

标签: generics kotlin

以下函数获取一个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}}强制转换为TSerializable是否确定采用<T : Serializable>的函数/ lambda必须采用Serializable

2 个答案:

答案 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的类Class2Serializable。如果使用包含Class1的列表调用此函数,但发射器使用Class2,则将Class1移出列表并将其传递到发射器时,它将是类强制转换异常只需Class2

在@ r2rek发布的示例中,该函数将列表和发射器强制为相同的类。