为什么我不能在Scala中将一个String实例转换为Iterable [Char]

use*_*028 7 scala

这一行将失败:

"Hello".asInstanceOf[Iterable[Char]]
Run Code Online (Sandbox Code Playgroud)

但我可以将String的实例传递给这样的方法:

def someMethod(input: Iterable[Char]): Unit = { ... }
someMethod("Hello")
Run Code Online (Sandbox Code Playgroud)

为什么?

Bri*_*hon 8

String不延伸Iterable[Char].这解释了为什么铸造失败.

然而,Scala的PREDEF 定义的隐式转换StringWrappedString,和WrappedString 延伸Iterable[Char].这就是你的第二个例子有效的原因.编译器添加了转换,因此编译后的代码看起来更像这样:

someMethod(wrapString("Hello"))
Run Code Online (Sandbox Code Playgroud)

如果你想知道它为什么这样做,那是因为String实际上是java.lang.String来自Java标准库(出于Java兼容性原因),因此WrappedString创建了一个适配器String适应Scala集合库,并且添加了隐式转换使这几乎无缝.