我的域类是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()
接受变量参数的方法。copy()
实现已经在范围内,但由于正确的数据类型无法实现,因此无法实现推断。我希望转而使用正确的类型转换来访问copy()
。