这一行将失败:
"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 次 |
最近记录: |