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).

  • ¿Cómo funciona el borrado en Kotlin?
  • El método RXjava2 en fromCallable no se puede exceder
  • Diferencia entre protegido y sin
  • ¿Cómo se transfiere a una interfaz / class de la class Kotlin de String?
  • Referencia no resuelta: SpringExtension utilizando @ExtendWith anotación
  • ¿Cómo puedo generar diagtwigs y UML del código de Kotlin?
  • Cómo hacer un bucle multicondicional para kotlin
  • Usando @ Component.Builder con parameters de constructor
  • ¿Hay alguna manera de pasar una reference de function entre actividades?
  • Android: el código funciona con api 19 pero no con api 24
  • Usar reflexión para pasar y modificar una primitiva sin usar matriz