【发布时间】:2018-04-14 17:25:53
【问题描述】:
所以我有以下情况。首先是一个类层次结构 A
trait A
trait B extends A
class C extends B
我还有一个类,它的泛型参数定义为 [T <: a>
class Foo[T <: A]
这个类定义了两个接受T类型对象的方法
def single(t: T): Bar
def multiple(lt: List[T]): Bars
如果对象t 和lt 都是从B 派生的类型,则这些方法中的这些方法调用另一个采用t 和lt(映射其元素)的方法,对其进行一些修改(这取决于类型本身)并吐出相同的对象
def update[P <: B](op: P, item: Item): P = {
if (item.field1..) op.field1 = item.field1
if (item.field2..) op.field2 = item.field2
...
op match {
case c: C =>
if (item.field123 ...) c.field123 = item.field123
}
op
}
我不喜欢这种方法现在的方式,因为它会对对象进行突变。当我遵循函数式编程风格时,我设法保持代码库不可变和可组合。
我更愿意将字段分配推送给构造函数并基于它们的父类构建对象,但由于 Scala 的辅助构造函数调用方案,我找不到这样做的方法。另一种方法是拥有一个案例类并使用复制构造函数,但我不能这样做,因为我需要保持 A、B 和 C 可扩展。
我希望我能够很好地描述我的场景。如果您需要更多说明 - 请询问。我将不胜感激。
【问题讨论】:
-
object是保留关键字,这不能是可编译的MCVE。 -
我会使用类型类来设计它。现在无法提供代码。如果没有人帮助,稍后会添加一个示例。
-
@simpadjo 将不胜感激!