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.

  • Ejecuta a lo mismo que a? .run en kotlin
  • Android Studio 1.5 con Kotlin Plugin recibió una exception, cuando está en modo debugging. ¿Como arreglarlo?
  • Spring Boot with AsyncRestTemplate Netty Client falla
  • Enlace de datos de Android: @BindingAdapter en Kotlin no reconoce lambdas
  • Kotlin con Eclipse y JRebel
  • Dokka usa nombres de class completamente calificados
  • Cómo deshabilitar Fabric cuando se ejecuta la testing
  • GridView solo elimina el primer elemento cuando se hace clic en un elemento. Java-> Kotlin
  • Android Parcelable en Kotlin: CREATOR no encontrado en la class de datos Parcelable
  • Atajo de IntelliJ para la configuration de ejecución
  • kotlin coroutine y la relación entre el manejador principal