如何更新实现通用接口的数据类

我正在努力处理数据类和多态性。 我想从不变性中受益,但仍然能够更新我的状态。 为此,我希望能够使用copy功能。

我们来举个例子。 我有这个类层次结构:

 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 

而现在我想能够做到这样的事情(但这不起作用):

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

我怎样才能以多态的方式创建更新的副本?

我试图给接口一个copy函数,但是如果子类型有附加属性,它们不会覆盖复制函数。
这是令人沮丧的,因为我知道这些子类有这个属性,但我不能在界面中利用这些知识。

[OP:]我想到的最好的确是在界面中声明复制功能:

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

这对于没有附加属性的数据类子类型来说是非常有用的(例如奶酪来自问题)。 对于具有附加属性的数据类子类型,您需要显式声明它,因为生成的copy函数不覆盖接口中的一个。

具有年龄拷贝实现的子类型如下所示:

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

希望得到更好的解决方案(或Kotlin改进))。

编辑:更新后按照Ghedeons的建议。