Comprende cómo funcionan los comodines y los cartones reificados en Kotlin

Lo siento si el título de la pregunta no es realmente significativo, pero no he encontrado una mejor manera de describir este problema.

Estoy escribiendo algunos methods de extensión de Kotlin para Hadoop, y ayer enumeré un extraño error que no entiendo. Escribí un par de methods de extensión como este:

inline fun <reified T : InputFormat<*, *>, reified K : Mapper<*, *, *, *>> Job.addMultipleInputPath(path: Path) { MultipleInputs.addInputPath(this, path, T::class.java, K::class.java) } inline fun <reified T : OutputFormat<*, *>, reified Key : Any, reified Value : Any> Job.addMultipleNamedOutput(namedOutput: String) { MultipleOutputs.addNamedOutput(this, namedOutput, T::class.java, Key::class.java, Value::class.java) } inline fun <reified T : Mapper<*, *, KeyClass, ValueClass>, reified KeyClass : Any, reified ValueClass : Any> Job.setMapper() { this.setMapperClass<T>() this.mapOutput<KeyClass, ValueClass>() } 

Y si bash llamarlos en mi class de controller, (1) y (3) funcionan pero (2) me da un error de compilation:

 with(Job.getInstance()) { // works addMultipleInputPath<TextInputFormat, SensorsMapperType2>(secInput) // 2 type arguments expected for class TextOutputFormat<K: Any!, V: Any!> : FileOutputFormat<K!, V!> // defined in org.apache.hadoop.mapnetworkinguce.lib.output addMultipleNamedOutput<TextOutputFormat, Text, SensorData>(HIGH_TEMP) // works setMapper<NGramMapper, Text, IntWritable>() } 

Si corrijo la llamada usando <TextOutputFormat<Any, Any>> todo funciona bien, pero no entiendo por qué sucede esto. ¿Hay algo que me falta sobre cómo funcionan los productos generics y reificados en Kotlin?

Se trata de types crudos, que kotlin no permite.

Este formatting funciona:

 addMultipleNamedOutput<TextOutputFormat<Text, SensorData>, Text, SensorData>(HIGH_TEMP) //(1) 

Estos dos no:

 addMultipleNamedOutput<TextOutputFormat, Text, SensorData>(HIGH_TEMP) //(2) 

Entonces las cosas se aclaran ahora. TextOutputFormat es ilegal porque Kotlin no permite types crudos. Debe especificar los arguments de tipo, que falta en (2). Al agregarlos, se obtiene el formatting (1).

Esto parece un poco detallado, pero actualmente no hay ninguna solución (al less en mi humilde opinión).

  • Enlazando una vista a una propiedad de controller cambiante
  • ¿Cómo determinar si un object es henetworkingado de cierta class en Kotlin?
  • Conversión de Kotlin a error de Javascript: "restar no es una function"
  • ¿Es posible eliminar el molde sin marcar en Kotlin cuando se usa arrayOfNulls?
  • Configuración de security de spring de Kotlin
  • Kotlin, Proguard y lambdas
  • Reflexión de Kotlin: get todos los nombres de campo de una class
  • ¿Puedo cambiar una class por object en Kotlin?
  • El contenido del fragment está oculto detrás de BottomNavigationView cuando se desplaza
  • cómo implementar una llamada limitada con retrofit que bloquea el cliente y corutinas
  • Kotlin utiliza la interfaz de callback de Java