Kotlin:方法无法与泛型一起使用

时间:2015-10-24 01:49:13

标签: generics 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)

1 个答案:

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