根据Scala Language Specification,
如果它们的组分的序列是成对等价的,并且以相同的顺序出现,则两种化合物类型是等价的,并且它们的改进是等价的。如果它们绑定相同的名称,则两个细化是等价的,并且每个声明的实体的修饰符,类型和边界在两个细化中都是等效的。
然而,鉴于
trait A { val a: Int }
trait B { val b: String }
我正在
scala> implicitly[A with B =:= B with A]
res0: =:=[A with B,B with A] = <function1>
即。它们被认为是等效的,即使组件的顺序不同。为什么呢?
答案 0 :(得分:3)
我认为=:=
证据只断言每个都是另一个的上限。
trait A; trait B
import scala.reflect.runtime.{universe => ru}
val ab = ru.typeOf[A with B]
val ba = ru.typeOf[B with A]
ab =:= ba // false!
ab <:< ba // true!
ba <:< ab // true!
如果LUB(X,Y)== X == Y,则基本上得到Predef,因为隐式解析会找到带有推断上限的=:=.tpEquals
。
这很可能是你想要的,因为这意味着你可以将一种类型视为另一种类型,这是有效的,因为A with B
的成员等于B with A
的成员,即使实现中的特征线性化是不同的。