今天我在Scala遇到了一些奇怪的情况,当时我试图改进抽象类型成员的类型边界.
我有两个特性定义类型成员的边界,并将它们组合在一个具体的类中.这工作正常但是当匹配/转换特征组合时,两个TypeBounds中只有一个是"活跃的",我很难理解为什么......
我试着准备一个例子:
trait L
trait R
trait Left {
type T <: L
def get: T
}
trait Right {
type T <: R
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我将这两个特征结合在一个具体的类中
val concrete = new Left with Right {
override type T = L with R
override def get: T = new L with R {}
}
Run Code Online (Sandbox Code Playgroud)
我可以按预期访问我的会员
// works fine
val x1: L with R = concrete.get
Run Code Online (Sandbox Code Playgroud)
但是如果我转向(左边右边)或模式匹配我再也无法访问该成员了.根据顺序,我从左或右获得类型边界,但不是两者的组合.
// can only access as R, L with R won't work
val x2: R = …Run Code Online (Sandbox Code Playgroud)