gpt4 book ai didi

generics - 编写一个通用的 Scala 转换函数

转载 作者:行者123 更新时间:2023-12-01 20:18:50 24 4
gpt4 key购买 nike

我试图编写一个方法,将 Any 值转换为特定类型并返回选项,而不是抛出像 instanceOf 这样的异常。 Scala 的行为并不像我预期的那样:

def cast[A](value: Any): Option[A] =
{
try
{
Some(value.asInstanceOf[A])
} catch
{
case e: Exception => None
}
}

测试:

val stringOption: Option[String] = cast[String](2)
stringOption must beNone

因错误而失败

java.lang.Exception: 'Some(2)' is not None

有人知道为什么吗?

最佳答案

这里的游行队伍将被抹去。因此,在运行时,类型 A 不再是已知的,并且 asInstanceOf[A] 被编译为无操作。它只是让编译器相信结果值是 A 类型,但实际上在运行时并不能保证这一点。

不过,您可以使用 Scala 的 list 来解决这个问题。不幸的是,JVM 对原始类型/装箱的处理迫使我们做一些额外的工作。

以下内容有效,尽管它不处理类型的“弱一致性”,这意味着例如Int 不被视为 Long,因此 cast[Long](42) 返回 None

def cast[A : Manifest](value: Any): Option[A] = {
val erasure = manifest[A] match {
case Manifest.Byte => classOf[java.lang.Byte]
case Manifest.Short => classOf[java.lang.Short]
case Manifest.Char => classOf[java.lang.Character]
case Manifest.Long => classOf[java.lang.Long]
case Manifest.Float => classOf[java.lang.Float]
case Manifest.Double => classOf[java.lang.Double]
case Manifest.Boolean => classOf[java.lang.Boolean]
case Manifest.Int => classOf[java.lang.Integer]
case m => m.erasure
}
if(erasure.isInstance(value)) Some(value.asInstanceOf[A]) else None
}

关于generics - 编写一个通用的 Scala 转换函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7059451/

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