gpt4 book ai didi

Scala asInstanceOf 泛型类型不会在 Try 中失败

转载 作者:行者123 更新时间:2023-12-02 21:24:51 26 4
gpt4 key购买 nike

尝试将 String 转换为 Double 显然会失败:

scala> Try("abc".asInstanceOf[Double])
res11: scala.util.Try[Double] = Failure(java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Double)

但是,如果我将上面的定义为一个函数:

scala> def convertAsTypeOf[T](anyValue: Any): Try[T] = Try(anyValue.asInstanceOf[T])
convertAsTypeOf: [T](anyValue: Any)scala.util.Try[T]

奇怪的是,当我尝试将 String 转换为 Double 时,它返回 Success:

scala> convertAsTypeOf[Double]("abc")
res10: scala.util.Try[Double] = Success(abc)

如果我尝试从 Success 中获取值,则会出现以下异常:

scala> convertAsTypeOf[Double]("abc").get
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Double
at scala.runtime.BoxesRunTime.unboxToDouble(BoxesRunTime.java:119)

为什么会这样?有什么方法可以解决此问题并在通用函数中生成 asInstanceOf[T] 吗?

最佳答案

由于类型删除,T 类型在运行时是未知的,因此 asInstanceOf 无法实际检查它所做的转换。事实上,它编译为空操作。但是,当 .get 最终完成时,将对 Double 进行强制转换,因为此处的类型已知,我们可以获得 ClassCastException

如果您将 convertAsTypeOf 更改为使用 ClassTag:

def convertAsTypeOf[T](anyValue: Any)(implicit tag: ClassTag[T]): Try[T] =
Try(tag.runtimeClass.cast(anyValue).asInstanceOf[T])

然后您将在预期的时候得到错误:

scala> convertAsTypeOf[Double]("abc")
res1: scala.util.Try[Double] = Failure(java.lang.ClassCastException: Cannot cast java.lang.String to double)

ClassTag 在运行时表示类型 T,允许根据它检查值。

关于Scala asInstanceOf 泛型类型不会在 Try 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25225336/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com