Why asInstanceOf doesn't throw a ClassCastException?

后端 未结 1 719
花落未央
花落未央 2020-12-07 00:52

Why asInstanceOf doesn\'t throw a ClassCastException ?

scala> List(\"a\").asInstanceOf[List[Int]]
res34: List[Int] = List(a)
相关标签:
1条回答
  • 2020-12-07 01:30

    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
    
    0 讨论(0)
提交回复
热议问题