我想对案例类字段之间的一些相互依赖性进行建模,以便 rhs
字段的可能值取决于 lhs< 的类型
.
在下面的示例中,我没有成功编写type B = A.B
- 它无法编译,只能type B = A#B
。毫不奇怪,在下面的示例中,这一行确实可以编译: SomeDomain.Foo(SomeDomain.Brr, SomeDomain.Bee.Pooh)
尽管这达不到目的。
显然我做错了什么。这里有一个小修复吗?或者,我应该采取完全不同的方法吗?
// Entering paste mode (ctrl-D to finish)
trait Domain {
trait Bar {
type B
}
type A <: Bar
type B = A#B
case class Foo(lhs: A, rhs: B)
}
object SomeDomain extends Domain {
sealed trait Baz extends Bar {
sealed trait Inner
override type B = Inner
}
case object Brr extends Baz {
case object Strawberry extends Inner
case object Raspberry extends Inner
}
case object Bee extends Baz {
case object Honey extends Inner
case object Pooh extends Inner
}
override type A = Baz
}
val foo = SomeDomain.Foo(SomeDomain.Brr, SomeDomain.Bee.Pooh)
val f1= foo.lhs
val f2 = foo.rhs
// Exiting paste mode, now interpreting.
defined trait Domain
defined object SomeDomain
foo: SomeDomain.Foo = Foo(Brr,Pooh)
f1: SomeDomain.A = Brr
f2: SomeDomain.B = Pooh
最佳答案
最可靠的方法是使用带有显式类型参数的类型成员:
trait T { type O }
case class Foo[A](t: T { type O = A }, a: A)
关于scala - 如何对案例类字段之间的相互依赖关系进行建模?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44302807/