我看到有两种方法可以在Scala中强制转换对象:
foo.asInstanceOf[Bar]
(foo: Bar)
当我尝试时,我发现
asInstanceOf
不使用隐式转换,而另一个使用隐式转换。这两种方法在行为上有什么区别?并建议在哪里使用另一个?
最佳答案
foo.asInstanceOf[Bar]
是类型的类型,主要是运行时操作。它说应该强制编译器相信foo
是Bar
。如果并且在运行时将ClassCastException
评估为不是foo
,则可能会导致错误(Bar
)。 foo:Bar
是类型和的描述,它完全是编译时操作。这有助于编译器帮助您理解代码的含义,而不会强制其相信可能不真实的任何内容。使用类型说明不会导致运行时失败。 类型说明也可以用于触发隐式转换。例如,您可以定义以下隐式转换:
implicit def foo(s:String):Int = s.length
然后确保其用法如下:
scala> "hi":Int
res29: Int = 2
将类型
Int
赋予String
通常是编译时类型错误,但是在放弃编译器之前,它将搜索可用的隐式转换以使问题消失。在编译时已知将在给定上下文中使用的特定隐式转换。毋庸置疑,运行时错误是不希望的,因此您可以在某种程度上以类型安全的方式指定事物(不使用
asInstanceof
),效果更好!如果发现自己使用asInstanceOf
,则可能应该改用match
。关于scala - Scala中的asInstanceOf [T]和(o:T)有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3412068/