¿Puedes tener un constructor primario genérico en Kotlin?

Esto funcionaría:

class Generic<T, R>(thingy: R) { val x = thingy.getX() } 

Pero el parámetro R realidad no debería ser parte de la firma de class. Es relevante solo en el momento de la construcción. De la misma forma que un parámetro de tipo de un método genérico no tiene nada que ver con los parameters de tipo de la class.

Sin embargo, esto no funciona:

 class Generic<T>(thingy: R) { val x = thingy.getX() } 

tampoco hace esto:

 class Generic<T><R>(thingy: R) { val x = thingy.getX() } 

y no encontré la respuesta en la documentation .

Eso no es posible directamente.

Sin embargo, puede lograr un resultado deseado utilizando un método de fábrica:

 interface HasX<out V> { val x: V } class Generic<T>(val x: Int) { companion object { fun <T, R : HasX<Int>> create(thingy: R) = Generic<T>(thingy.x) } } val result: Generic<String> = Generic.create(object : HasX<Int> { override val x: Int = 12 }) 

Por lo general, los methods de fábrica comienzan con minúsculas (p mutableList Ej., mutableList ); no hay nada que te mutableList hacer las cosas de manera diferente:

 fun <T, X : HasX<Int>> Generic(thingy: X):Generic<T> = Generic(thingy.x) val result: Generic<String> = Generic(object : HasX<Int> { override val x: Int = 12 }) 

Según lo observado por @Alexey Romanow, partes de Kotlin stdlib usan este enfoque .

  • instancia :: class.java vs. instance.javaClass
  • Definición recursiva de secuencia infinita en Kotlin
  • Interfaz anidada en Kotlin
  • AsyncTask sin fugas
  • cómo get DB id solo después de hacer clic en imageButton en el elemento listView con kotlin
  • ¿Puedo actualizar un object inmutable profundamente nested sin tomar conciencia de su context?
  • En kotlin, cómo devolver una instancia definida por un parámetro de class genérico
  • Daga 2 inyectando el model de vista de actividad en fragment
  • Desarrollo de biblioteca. Usando datos de fonts externas
  • Robolectric addResolveInfoForIntent no funciona
  • Error de reference no resuelto al llamar al método add en Kotlin Set interface