gpt4 book ai didi

generics - Kotlin:如何调用具有此类通用类型的lambda字段?

转载 作者:行者123 更新时间:2023-12-02 13:24:35 25 4
gpt4 key购买 nike

如何调用具有类通用类型的lambda字段?出于某种原因,对此类通用类(如Example<*>)的引用会产生一个接受,该接受用Example<Something>替换原始类型(如Nothing)。如何仅通过引用Example<*>来调用这种lambda?

代码库我遇到此问题:https://github.com/Jire/Acelta/tree/master/src/main/kotlin/com/acelta/packet/incoming/packets

我正在尝试这段代码,但是正如您在第五行看到的那样,我无法调用lambda,因为accept类型是Nothing

private val incoming = arrayOfNulls<Packet<*>>(256)

fun incoming(id: Int, packeteer: Packeteer) {
val packet = incoming[id] ?: return
packet.receive(packeteer, /* this is type Nothing! */)
}

最佳答案

这种行为就是Kotlin中star projections(Foo<*>)的工作方式。

如文档中所述

For Foo<T>, where T is an invariant type parameter with the upper bound TUpper, Foo<*> is equivalent to Foo<out TUpper> for reading values and to Foo<in Nothing> for writing values.



如果使用星型投影 Packet<*>,则对它的通用类型一无所知,因此您不能安全地将任何值传递给需要通用参数的方法(这就是 Nothing类型的原因)。

您可以使用 in-projection为泛型类型指定下限,对于 Packet<in SomeType>,您可以将 SomeType的实例传递到方法中。这将要求 Packet的实际类型参数为 SomeType或它的某些祖先,类似于Java中的 ? super T通配符:
private val incoming = arrayOfNulls<Packet<in SomeType>>(256)

fun incoming(id: Int, packeteer: Packeteer) {
val packet = incoming[id] ?: return
packet.receive(packeteer, someTypeInstance)
}

否则,您可以使用未经检查的强制转换来调用该方法,尽管它可能导致 ClassCastException抛出在内部某处:
(packet as Packet<in SomeType>).receive(packeteer, someTypeInstance)

关于generics - Kotlin:如何调用具有此类通用类型的lambda字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37130979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com