繁体   English   中英

为什么1.asInstanceOf [T]不抛出ClassCastException?

[英]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-langClassUtils.isAssignable

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM