【发布时间】:2016-04-22 05:32:06
【问题描述】:
我使用 Miles Sabin gist 中的标记类型:
type Tagged[U] = { type Tag = U }
type @@[T, U] = T with Tagged[U]
trait MyTrait
def tag(s: String): String @@ MyTrait = s.asInstanceOf[String @@ MyTrait]
我可以像这样使用它(并且有效):
scala> tag("lala")
res7: @@[String,MyTrait] = lala
我的问题是:如何?这怎么不抛出ClassCastexception:s.asInstanceOf[String @@ MyTrait]。从我的角度来看,"lala" 是 String 类型,但不是 String with { type Tag = MyTrait} 类型,因为它像通常的 String 对象一样被实例化。 asInstanceOf 方法有什么魔力?
【问题讨论】:
-
{ type Tag = MyTrait }在运行时并不真正存在,它被完全擦除并且仅由 Scala 编译器考虑。 -
那么当
s.asInstanceOf[String @@ MyTrait]被调用时运行时发生了什么?
标签: scala functional-programming scalaz