为什么此具有上限的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

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

但是,您的发射器不占用任何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)
        }
    }

它不需要强制转换。

,

我想举个例子,说明为什么不进行强制转换就不能编译它。

想象一下有两个实现或扩展Class1的类Class2Serializable。如果使用包含Class1的列表调用此函数,但发射器使用Class2,则将Class1移出列表并将其传递到发射器时,它将是类强制转换异常只需Class2

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

本文链接:https://www.f2er.com/3154218.html

大家都在问