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)
}