Why does `.asInstanceOf` sometimes throw, and sometimes not?

后端 未结 2 1375
南旧
南旧 2021-01-05 04:02

I was trying to answer this question, as I thought I knew the answer. Turns out, I did not know quite enough :/

Here is a test I have done:

class In         


        
2条回答
  •  长情又很酷
    2021-01-05 04:37

    While @0__'s answer explains why it doesn't work, here is how to make it work:

    class Inst[T](implicit tag: scala.reflect.ClassTag[T]) {
      def is(x: Any) = tag.runtimeClass.isInstance(x) 
      // scala.util.Try { as(x) }.isSuccess will work as well
      def as(x: Any): T = tag.runtimeClass.cast(x).asInstanceOf[T]
    }
    
    object Main extends App {
      println(new Inst[String].is(3))
      println(new Inst[String].as(3))
    }
    
    
    false
    java.lang.ClassCastException: Cannot cast java.lang.Integer to java.lang.String
        at java.lang.Class.cast(Class.java:3369)
    ...
    

提交回复
热议问题