Cómo actualizar las classs de datos implementando una interfaz común

Estoy luchando con las classs de datos y el polymorphism. Quiero beneficiarme de la inmutabilidad, pero aún así poder actualizar mi estado. Para esto, espero poder usar la function de copy .

Vamos a dar un ejemplo. Tengo esta jerarquía de class:

 interface Aging { val age : Int } data class Cheese ( override val age : Int // more Cheese specific properties ) : Aging data class Wine ( override val age : Int, val grape : String // more Wine specific properties ) : Aging 

Y ahora quiero poder hacer algo como esto (pero esto no funciona):

 class RipeningProcess(){ fun ripen(products : List<Aging>) = // Not possibe, no copy function on Aging products.map { it.copy(age = it.age + 1) } } 

¿Cómo puedo crear copys actualizadas de forma polimórfica?

Intenté darle a la interfaz una function de copy , pero si los subtypes tienen properties adicionales, no anulan la function de copy.
Es frustrante ya que sé que los subtypes tienen esa propiedad, pero no puedo utilizar ese conocimiento en la interfaz.

[OP:] Lo mejor que se me ocurre es declarar la function de copy en la interfaz:

 interface Aging { val age : Int fun copy(age : Int) : Aging } 

Esto funciona fuera de la caja para subtypes de class de datos sin properties adicionales (es decir, queso de la pregunta). Para los subtypes de class de datos con properties adicionales, debe declararlo explícitamente, ya que la function de copy generada no anula la de la interfaz.

El subtipo con su implementación de copy de edad se ve así:

 data class Wine( override val age : Int, val grape : String ) : Aging { // Different parameter name, to avoid conflict with generated copy method override fun copy(_age: Int) = copy(age = _age) } 

Esperando mejores soluciones (o una mejora de Kotlin;)).

Editar: actualizado para seguir la sugerencia de Ghedeons.

  • Custom Glide ModelLoader para imágenes base64
  • No se puede probar la unidad en Kotlin (ExecutionException, Aapt2Exception)
  • Getpreferences no funciona en fragment
  • Usar un object Kotlin en una class generada en time de ejecución
  • Hace Cualquiera == Objeto
  • Map.mapTo a otro map
  • Kotlin NoClassDefFoundError con el método @RequestMapping de spring
  • ¿Cómo usar "Definición funcional de frijoles Kotlin DSL" con Spring Boot y Spring WebFlux?
  • Cómo mantener el tipo de object para el casting inteligente al devolver cualquier
  • Cómo hacer la sum de elementos para la list múltiple en kotlin
  • Encuentra los usos del constructor primario de una class Kotlin