Yann Moisan
Yann Moisan

Reputation: 8281

Why asInstanceOf doesn't throw a ClassCastException?

Why asInstanceOf doesn't throw a ClassCastException ?

scala> List("a").asInstanceOf[List[Int]]
res34: List[Int] = List(a)

Upvotes: 16

Views: 2259

Answers (1)

Ende Neu
Ende Neu

Reputation: 15783

From the scaladoc:

Note that the success of a cast at runtime is modulo Scala's erasure semantics. Therefore the expression 1.asInstanceOf[String] will throw a ClassCastException at runtime, while the expression List(1).asInstanceOf[List[String]] will not. In the latter example, because the type argument is erased as part of compilation it is not possible to check whether the contents of the list are of the requested type.

If you try to access the variable or map the conversion it correclty throws an exception:

scala> List("a").asInstanceOf[List[Int]]
res0: List[Int] = List(a)

scala> res0
res1: List[Int] = List(a)

scala> res0(0)
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer

List("a").map(_.asInstanceOf[Int])
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer

Upvotes: 18

Related Questions