Kotlin:方法不能与泛型一起使用
Kotlin: Method not able to be used with generics
作为这个的反面:
interface PacketDecoder<out T : Packet> : PacketTranscoder {
fun decode(client: Client, buf: ByteBuf): T
}
我正在尝试使用这个:
interface PacketEncoder<in T : Packet> : PacketTranscoder {
fun encode(packet: T, buf: ByteBuf)
}
虽然 PacketDecoder
似乎工作正常,但我无法参考 encode(T, ByteBuf)
方法。 IntelliJ IDEA 自动完成甚至不将其显示为一个选项,手动编写它会导致未解决的引用错误。
为了解决这个问题,我目前正在使用这个技巧,但我认为这不是正确的方法。
fun <P : T> encode(packet: P, buf: ByteBuf)
它不起作用的原因是因为我是从值 HashMap<KClass<*>, PacketEncoder<*>>()
引用的,因此 Kotlin 无法生成 encode
方法的签名,因为 *
不是有效的通用签名(有人可以确认吗?)。
这是我的结果代码,我不得不使用未经检查的转换为 PacketEncoder<T>
:
fun <T : Packet> encode(packet: T, buf: ByteBuf) {
val encoder = (encoders[packet.javaClass.kotlin] ?: return) as PacketEncoder<T>
buf.writeByte(encoder.id)
encoder.encode(packet, buf)
}
作为这个的反面:
interface PacketDecoder<out T : Packet> : PacketTranscoder {
fun decode(client: Client, buf: ByteBuf): T
}
我正在尝试使用这个:
interface PacketEncoder<in T : Packet> : PacketTranscoder {
fun encode(packet: T, buf: ByteBuf)
}
虽然 PacketDecoder
似乎工作正常,但我无法参考 encode(T, ByteBuf)
方法。 IntelliJ IDEA 自动完成甚至不将其显示为一个选项,手动编写它会导致未解决的引用错误。
为了解决这个问题,我目前正在使用这个技巧,但我认为这不是正确的方法。
fun <P : T> encode(packet: P, buf: ByteBuf)
它不起作用的原因是因为我是从值 HashMap<KClass<*>, PacketEncoder<*>>()
引用的,因此 Kotlin 无法生成 encode
方法的签名,因为 *
不是有效的通用签名(有人可以确认吗?)。
这是我的结果代码,我不得不使用未经检查的转换为 PacketEncoder<T>
:
fun <T : Packet> encode(packet: T, buf: ByteBuf) {
val encoder = (encoders[packet.javaClass.kotlin] ?: return) as PacketEncoder<T>
buf.writeByte(encoder.id)
encoder.encode(packet, buf)
}