[英]Why does 1.asInstanceOf[T] not throw ClassCastException?
scala> def g[T] = 1.asInstanceOf[T]
g: [T]=> T
scala> g[String]
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
... 32 elided
scala> { g[String]; 1 }
res0: Int = 1
但:
scala> def f = 1.asInstanceOf[String]
f: String
scala> { f; 1 }
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at .f(<console>:7)
... 32 elided
这里的逻辑是什么? 如何在类型参数函数中触发ClassCastException
?
此警告回答了我的问题:
scala> def g[T] = 1.isInstanceOf[T]
<console>:7: warning: abstract type T is unchecked since it is eliminated by erasure
def g[T] = 1.isInstanceOf[T]
^
因此asInstanceOf[T]
是编译时的asInstanceOf[T]
。 它在运行时不起作用。 在我得到ClassCastException
的情况下,它不是由asInstanceOf[T]
引发的,而是由函数外部发生的实际转换引起的。
解决方案是采用ClassTag
并使用classTag[T].runtimeClass.cast
。 这表现略有不同,虽然:您可以使用asInstanceOf[Double]
上的Int
,但cast
将失败, ClassCastException
。 然后,解决此问题的方法是使用Apache commons-lang
的ClassUtils.isAssignable
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.