如何在泛型类

时间:2017-06-05 14:58:22

标签: scala generics copy case-class

我的域类是case类,我有一般的引擎/变换器类对它们进行操作。我使用了诸如copy()之类的case类功能,并希望在对类进行一般处理时这样做,这是一个简单的例子:

trait Fruit { val color: String }

case class Apple (color: String = "red") extends Fruit

case class Banana (color: String = "yellow") extends Fruit

case class Orange (color: String = "orange") extends Fruit

val apple = new Apple
val newApple1 = apple.copy(color = "green") // compiles fine

object Transformer {
  def apply(fruit: Fruit): Fruit = {
    fruit.copy(color = "green") // does not compile, "Cannot resolve symbol copy"
  }
}

val newApple2 = Transformer(apple)

newApple2

在此示例中,对copy()的第一次调用工作正常,但尝试在apply()类的Transformer方法中执行相同类型的操作不会,我假设是因为Scala不知道Fruit是一个案例类,因此具有运行时生成的copy()方法。

我尝试了各种类型转换,例如,使Fruit成为一个抽象类,或者让它扩展scala.Product(内部是最接近案例类的祖先),但这并没有。使copy()方法可用。

如果我可以避免它,我宁愿不自己实现复制方法,尽管有反射或无形,它可能以通用的方式完成。

StackOverflow上还有一些其他类似的问题,但是我没有看到解决这个问题的答案,感谢任何信息。

编辑:我的问题类似于this recent question但是由于这些原因,那里的答案并不令我满意:

  • 接受的解决方案建议实现copyWithId()方法,换句话说,是一个带有一个或多个特定参数的特殊用途copy()方法,而我想使用非常通用的案例类copy()接受变量参数的方法。
  • 那里提出的解决方案使用无形或镜片以及许多Scala" magic"这对我来说似乎不应该是必要的,因为正如我的例子所示,我之后的copy()实现已经在范围内,但由于正确的数据类型无法实现,因此无法实现推断。我希望转而使用正确的类型转换来访问copy()

0 个答案:

没有答案