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

Sti*_*tim 9 kotlin data-class

我正在努力处理数据类和多态.我想从不变性中受益,但仍然能够更新我的状态.为此,我希望能够使用该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   
Run Code Online (Sandbox Code Playgroud)

现在我希望能够做这样的事情(但是不工作):

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

如何以多态方式创建更新的副本?

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

Sti*_*tim 7

[OP:]我提出的最好的方法是在界面中声明复制功能:

interface Aging {
  val age : Int
  fun copy(age : Int) : Aging
}
Run Code Online (Sandbox Code Playgroud)

这开箱即用于没有其他属性的数据类子类型(即问题中的Cheese).对于具有其他属性的数据类子类型,您需要显式声明它,因为生成的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)
}
Run Code Online (Sandbox Code Playgroud)

希望有更好的解决方案(或Kotlin改进;)).

编辑:更新以遵循Ghedeons的建议.

  • 另一种诱骗它选择正确方法的方法是为复制参数使用不同的名称。例如:`override fun copy(_age: Int) = copy(age = _age)`。 (2认同)