gpt4 book ai didi

scala - 为什么 `.asInstanceOf` 有时会抛出,有时不会?

转载 作者:行者123 更新时间:2023-12-04 06:16:54 28 4
gpt4 key购买 nike

我试图回答 this问题,因为我以为我知道答案。
事实证明,我还不够了解:/

这是我做过的一个测试:

class Inst[T] { 
def is(x: Any) = scala.util.Try { as(x) }.isSuccess
def as(x: Any): T = x.asInstanceOf[T]
}

scala> new Inst[String].is(3)
res17: Boolean = true

scala> new Inst[String].as(3)
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
... 33 elided

这里发生了什么?为什么只有第二个调用 as扔,但不是第一个?

最佳答案

这是因为 class-cast-exception 仅在您对值执行某些操作时才会引发,并在转换后对其调用方法。例如,在 REPL 中,您将有一个 toString在第二种情况下调用。笔记:

new Inst[String].as(3); ()           // nothing happens
new Inst[String].as(3).toString; () // exception

这需要额外步骤的原因是 Inst[T]是泛型类型参数 T在运行时被删除;只有当调用站点(具有 T 类型的静态知识)尝试对结果调用方法时,才会发生实际的类型检查。

对于您的后续问题, toString定义在任何对象上,因为 T是通用的,你有一个装箱整数( <: AnyRef )和 toStringprintln成功内 is方法。另一个例子是 Try会失败是这样的:
class Inst[T] { 
def foo(x: Any)(implicit ev: T <:< String) = scala.util.Try {
ev(as(x)).reverse
}.isSuccess
}

new Inst[String].foo(3) // false!

关于scala - 为什么 `.asInstanceOf` 有时会抛出,有时不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34204473/

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