这一行将失败:
"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)
为什么?
String不延伸Iterable[Char].这解释了为什么铸造失败.
然而,Scala的PREDEF 定义的隐式转换从String到WrappedString,和WrappedString 不延伸Iterable[Char].这就是你的第二个例子有效的原因.编译器添加了转换,因此编译后的代码看起来更像这样:
someMethod(wrapString("Hello"))
Run Code Online (Sandbox Code Playgroud)
如果你想知道它为什么这样做,那是因为String实际上是java.lang.String来自Java标准库(出于Java兼容性原因),因此WrappedString创建了一个适配器以String适应Scala集合库,并且添加了隐式转换使这几乎无缝.
| 归档时间: |
|
| 查看次数: |
116 次 |
| 最近记录: |