gpt4 book ai didi

scala - asInstanceOf[T] 和 (o : T) in Scala?

转载 作者:行者123 更新时间:2023-12-03 06:12:19 25 4
gpt4 key购买 nike

我看到Scala中有两种方法可以转换对象:

foo.asInstanceOf[Bar]
(foo: Bar)

当我尝试时,我发现 asInstanceOf 不使用隐式转换,而另一个则使用。

这两种方法之间的行为有何差异?在哪里建议使用其中一种而不是另一种?

最佳答案

  • foo.asInstanceOf[Bar] 是一个类型强制转换,它主要是一个运行时操作。它表示应该强制编译器相信 foo 是一个 Bar。如果在运行时 foo 被评估为 Bar 之外的其他内容,则可能会导致错误(ClassCastException)。

  • foo:Bar 是一个类型ascription,它完全是一个编译时操作。这可以帮助编译器理解代码的含义,而不强制它相信任何可能不真实的东西;使用类型归属不会导致运行时故障。

类型归属也可用于触发隐式转换。例如,您可以定义以下隐式转换:

implicit def foo(s:String):Int = s.length

然后确保其使用如下:

scala> "hi":Int                                 
res29: Int = 2

将类型 Int 归因于 String 通常会出现编译时类型错误,但在放弃之前,编译器会搜索可用的隐式转换来解决问题离开。将在给定上下文中使用的特定隐式转换在编译时已知。

不用说,运行时错误是不受欢迎的,因此您可以以类型安全方式(不使用asInstanceof)指定事物的程度越好!如果您发现自己使用 asInstanceOf,您可能应该使用 match

关于scala - asInstanceOf[T] 和 (o : T) in Scala?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3412068/

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