2015-10-24 52 views
1

本作的另一面可以使用:科特林:方法不能與仿製藥

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

我已經嘗試實現它的理念,它沒有錯誤的偉大工程。 https://gist.github.com/alien11689/67ac3edbe562555acc7f – Alien11689

+0

Works here:http://try.kotlinlang.org/#/UserProjects/hrcd2j34aellk5fdg7gv7sfeei/u9ue9h9dr1tkv98gdpthh3dea1 –

回答

0

它不工作的原因是因爲我是從一個值HashMap<KClass<*>, PacketEncoder<*>>()指這樣爲*不是一個有效的通用簽名科特林不能產生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) 
}