Kotlin: método no puede ser utilizado con generics

Como la otra cara de esto:

interface PacketDecoder<out T : Packet> : PacketTranscoder { fun decode(client: Client, buf: ByteBuf): T } 

Estoy tratando de usar esto:

 interface PacketEncoder<in T : Packet> : PacketTranscoder { fun encode(packet: T, buf: ByteBuf) } 

Aunque PacketDecoder parece funcionar bien, no puedo referirme al método de encode(T, ByteBuf) . El autocompletado de IntelliJ IDEA ni siquiera lo muestra como una opción y la escritura manual resulta en un error de reference no resuelto.

Para evitarlo, actualmente estoy usando este truco, pero no creo que esta sea la forma correcta de hacerlo.

 fun <P : T> encode(packet: P, buf: ByteBuf) 

La razón por la que no funcionó es porque me refería a un valor HashMap<KClass<*>, PacketEncoder<*>>() tanto, Kotlin no pudo generar la firma del método de encode ya que * no es una firma genérica válida (¿Alguien podría confirmar?).

Este es mi código resultante, tuve que usar un elenco sin PacketEncoder<T> para 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) } 
  • Argumentos no utilizados al destruir un object en Kotlin
  • Retrofit2 + SimpleXML en Kotlin: MethodException: la anotación debe marcar un set o método get
  • Kotlin parse Hex String a Long
  • Cómo usar la expresión `with` de Kotlin para types anulables
  • Realm Nested Object sort
  • Kotlin: Al ejecutar Hello Program obteniendo ClassNotFoundException
  • Transacciones de Jooq: las conexiones no se liberan al set, si se lanza una exception en la transacción
  • ¿Cómo guardo un logging en Apache Jena?
  • Kotlin IllegalStateException: recurso no encontrado en classpath: kotlin / .kotlin_string_table
  • Deserialization Gson con Kotlin, bloque inicializador no llamado
  • Kotlin coroutines unit testing usando mockito