gpt4 book ai didi

scala - 为什么用 Option 包装泛型方法调用会延迟 ClassCastException?

转载 作者:行者123 更新时间:2023-12-02 16:31:09 28 4
gpt4 key购买 nike

假设我有一个像这样的数组*:

val foo: Any = 1 : Int
Option(foo.asInstanceOf[String])

由于明显的原因而失败:

// java.lang.ClassCastException: java.lang.Integer cannot be cast to 
// java.lang.String
// ... 48 elided

接下来让我们考虑以下类:

case class DummyRow() {
val foo: Any = 1 : Int
def getAs[T] = foo.asInstanceOf[T]
def getAsOption[T] = Option(foo.asInstanceOf[T])
}

据我所知,getAs 的行为应该与前面的 apply 后跟 asInstanceOf 的行为相同。

令人惊讶的是事实并非如此。当单独调用时,它会抛出异常:

DummyRow().getAs[String]
// java.lang.ClassCastException: java.lang.Integer cannot be cast to
// java.lang.String
// ... 48 elided

但是当用 Option 包装时成功:

val stringOption = Option(DummyRow().getAs[String])
// Option[String] = Some(1)

DummyRow().getAsOption[String]
// Option[String] = Some(1)

并且仅当我尝试访问包装值时才会失败:

stringOption.get
// java.lang.ClassCastException: java.lang.Integer cannot be cast to
// java.lang.String
// ... 48 elided

那么这里会发生什么?它似乎受到 ClassCastException 的限制,所以我猜它与类型删除等一些丑陋的事情有关。

<小时/>

* AnyasInstanceOf 是为了模仿第 3 方代码的行为,因此请不要过多关注这一点。

** 在 Scala 2.10.5、2.11.7 中测试

*** 如果您对上下文感兴趣,可以查看 Using contains in scala - exception

**** 评论中链接的其他相关问题:

最佳答案

下面是您的问题的简化版本,以及 Any 的附加案例

def getAs[T] = (1:Int).asInstanceOf[T]

//blows up
getAs[String]

//blows up
def p(s:String): Unit = {}
p(getAs[String])

//works
def p[T](s:T): Unit = {}
p(getAs[String])

//works
def p(s:Any): Unit = {}
p(getAs[String])

因为您创建了一个带有泛型参数的方法,所以运行时不需要“接触”该值,因为它不关心。泛型在运行时将被视为 Any/Object

关于scala - 为什么用 Option 包装泛型方法调用会延迟 ClassCastException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36138540/

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