說我有兩個類具有相同標識符的參數化類型斯卡拉:抽象類型和混入
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