1
我有以下类层次结构。斯卡拉层次分解和类型参数
sealed trait Foo {
val a: String
}
case class Bar1(a: String) extends Foo
case class Bar2(a: String) extends Foo
现在我想添加一个方便的方法来修改字段a
。我需要在超类型Foo
中使用此方法,并且我想使用case类的.copy
方法(因为实际上我有更多的字段并且使用构造函数很痛苦)。我第一次尝试是使用模式匹配:
sealed trait Foo {
val a: String
def withField(b: String) = this match {
case b1: Bar1 => b1.copy(a = b)
case b2: Bar2 => b2.copy(a = b)
}
}
现在我也想我withField
方法返回调用者,B1
的实例类型,如果该方法是通过,如果该方法的B1
类型,B2
的实例调用如果这是我所知道的,则由B2
和Foo
类型的实例调用。所以我想我自己可能可以参数化方法withField
来达到这个目的。喜欢的东西:
sealed trait Foo {
val a: String
def withField[A <: Foo](b: String) = this match {
case b1: Bar1 => b1.copy(a = b)
case b2: Bar2 => b2.copy(a = b)
}
}
,但我不管理parametried withField
与this
类型。
我在这里完全错了吗?我应该使用不同的模式,可能使用override
修饰符?
非常感谢
还有一个问题需要注意:是否可以在字段中实现字段并返回正确类型(如Benoit试图这样做)? – Christian
@Christian请参阅编辑。我不会使用它,除非出于某种原因绝对需要。 –
是的,我认为第二种方法太复杂了。好,所以我猜如果我想返回Bar1和Bar2的实例,我不能在父类中抽象'withField' –