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

foo.asInstanceOf[Bar]
(foo: Bar)

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

这两种方法在行为上有什么区别?并建议在哪里使用另一个?

最佳答案

  • foo.asInstanceOf[Bar]类型的类型,主要是运行时操作。它说应该强制编译器相信fooBar。如果并且在运行时将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/

    10-12 02:56