Я использую маркированные типы из Miles Sabin сутью:Понимание Tagged Типы и asInstanceOf
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. – pedrofurla
так что происходит во время выполнения, когда вызывается 's.asInstanceOf [String @@ MyTrait]'? – ka4eli