说我有两个类具有相同标识符的参数化类型斯卡拉:抽象类型和混入
trait A {
type O
def f(a: Int, os: Seq[O]): Int
}
trait B {
type O
def g(a: Int, o: O): Int = { h1(o) + h2(a) }
def h1(o: O): Int
def h2(a: Int): Int = {a/2}
}
我想创建一个子类,将“嫁”两
trait C extends A with B {
def f(a: Int, os: Seq[O]): Int = {
os.map{ o => g(a, o) }.sum
}
}
最后,我建立了C
class D extends C {
type O = Int
def h1(o: O): Int = {5 * o}
}
的执行情况的书面C
我不ÿ等知道是什么类型的O
- 不过,我想限制A.O == B.O
,使得“有意义”在A.f
实现使用B.g
。我试图实现这一点,它令人惊讶的好像斯卡拉认为,只有过一个type O
val d = new D
println(d.f(1, Seq(1,2,3)))
对我来说,这似乎是不正确 - 为什么要A.O
和B.O
同意吗?
编辑 我也想指出,如果你是不是把约束O对像这样,
case class Z()
case class Z1() extends Z
case class Z2() extends Z1
trait A {
type O <: Z
}
trait B {
type O >: Z2
}
class D extends C {
type O = Z1
编译失败。但是,如果你把这个,而不是,
trait A {
type O <: Z
}
trait B {
type O <: Z1
}
class D extends C {
type O = Z2
编译成功,一切运行良好。
换句话说,“不要忘了Scala的类型线性化”! – duckworthd