在scala中,Map [_,_]和scala.collection.immutable.Map [_,_]如何具有不同的TypeTag?

时间:2017-12-30 04:29:31

标签: scala reflection scala-reflect

他们指的是同一件事,但当我比较2个类型的标签时:

val ttg1 = typeTag[Map[_,_]]
val ttg2 = typeTag[immutable.Map[_,_]]

assert(ttg1.tpe == ttg2.tpe)

我得到了:

Map[_, _] did not equal scala.collection.immutable.Map[_,_]
ScalaTestFailureLocation: 
Expected :scala.collection.immutable.Map[_,_]
Actual   :Map[_, _]

这怎么会用打字语言发生?我如何使它们相同?

对于List,

更新:这更令人困惑:

val ttg1 = typeTag[List[_]]
val ttg2 = typeTag[immutable.List[_]]

assert(ttg1.tpe == ttg2.tpe)

List[_] did not equal List[_]
ScalaTestFailureLocation: 
Expected :List[_]
Actual   :List[_]

他们完全一样!然而,反思选择忽视它。

1 个答案:

答案 0 :(得分:6)

当您真正想要类型等效时,您正在比较类型标识。在

type A = B

AB是两种不同的类型(这就是为什么它们有不同的类型标记)。尝试将测试更改为

assert(ttg1.tpe =:= ttg2.tpe)
关于类型测试等价的

=:=

相关问题