作为另一方面:
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)
答案 0 :(得分:0)
它没有工作的原因是因为我引用了一个值HashMap<KClass<*>, PacketEncoder<*>>()
,因此Kotlin无法生成encode
方法的签名,因为*
isn& #39;有效的通用签名(有人可以确认吗?)。
这是我生成的代码,我必须使用未经检查的强制转换为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)
}