- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
尝试将 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/
我正在试用 scalajs,但对如何使用 org.scalajs.dom.html 包访问 DOM 元素感到很困惑。通过反复试验,我发现有些元素需要使用 asInstanceOf 转换为特定类型,但有
在下面的代码中,是否可以在不使用 asInstanceOf 的情况下重新表述?我发现了一些应该避免使用 asInstanceOf/isInstanceOf 的样式指南建议,并且我设法清理了我的代码,除
我想编写一个转换为类型 A 的函数,其中 A 可以是例如List[Int],或更复杂的参数化类型,如 Map[Int, List[Int]]。 def castToType[A](x: Any): A
关于如何在不作弊和不使用 asInstanceOf 的情况下完成以下操作,我画了一个空白. 假设我有一些任意密封类型的对象,每个对象都有自己的类型成员。 sealed trait Part { t
我收到 not found: value Duck class Type class Value(val t: Type) class Duck extends Type {
考虑这个(有点做作的)例子: abstract class Obj[A, B] { def id: Long def parent: B } abstract class TopLev
如果您用这段非常糟糕的代码打扰 Scala 编译器(2.9.1 或 2.10.0-M7)... null.$asInstanceOf[Int] ...它抛出断言失败。问题:什么是 $asInstanc
在我的团队中,我经常看到队友在写作 list.filter(_.isInstanceOf[T]).map(_.asInstanceOf[T]) 但这对我来说似乎有点多余。 如果我们知道过滤列表中的所有
当我写我的 recent answer我还尝试以更“实用”的方式解决问题,但遇到了以下问题: scala> "1".asInstanceOf[Int] java.lang.ClassCastExcep
目前我的代码需要类转换 val dataWriter: BytesDataWriter = createDataWriter def createDataWriter(p: SomeClass) =
我试图回答 this问题,因为我以为我知道答案。 事实证明,我还不够了解:/ 这是我做过的一个测试: class Inst[T] { def is(x: Any) = scala.util.Try
这个问题在这里已经有了答案: What is happening with 0.asInstanceOf[B] in Scala reduceLeft implementation (2 个答案)
根据设计,我们确信我们有一个 HourlyDateFormat 的实例。 在这种情况下如何避免调用 asInstanceOf(即如何帮助编译器推断类型)? sealed trait Storage
我正在阅读 Akka Futures Guide我看到这句话: Also note that the Future returned by an Actor is a Future[Any] sinc
在 PlayFramework 2.4 中,我尝试将所有 Controller 方法转换为 JavaScript 路由。 val jsRoutesClass = classOf[routes.java
为什么 asInstanceOf 不抛出 ClassCastException ? scala> List("a").asInstanceOf[List[Int]] res34: List[Int]
这是我的代码的简化版本。 如何避免调用asInstanceOf (因为这是一个糟糕的设计解决方案的气味)? sealed trait Location final case class Single(
尝试将 String 转换为 Double 显然会失败: scala> Try("abc".asInstanceOf[Double]) res11: scala.util.Try[Double] =
尝试将 String 转换为 Double 显然会失败: scala> Try("abc".asInstanceOf[Double]) res11: scala.util.Try[Double] =
我有一个 Scala 类,它从 JOSN 模板文件中读取格式化信息,并从另一个文件中读取数据。目标是格式化为模板文件指定的 JSON 对象。我正在使用布局,但现在我想将输出类型设置为模板中的类型(即,
我是一名优秀的程序员,十分优秀!