Kotlin:方法不能和泛型一起使用

作为这个的另一面:

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