此行将失败:
"Hello".asInstanceOf[Iterable[Char]]
但是我可以将String的实例传递给这样的方法:
def someMethod(input: Iterable[Char]): Unit = { ... }
someMethod("Hello")
为什么?
答案 0 :(得分:8)
String
不扩展Iterable[Char]
。这说明了投放失败的原因。
但是,Scala Predef defines an implicit conversion从String
到WrappedString
,并且WrappedString
确实扩展了Iterable[Char]
。这就是第二个示例起作用的原因。编译器添加了转换,因此编译后的代码看起来像这样:
someMethod(wrapString("Hello"))
如果您想知道为什么要这样做,那是因为String
实际上是Java标准库中的java.lang.String
(出于Java兼容性的原因),所以WrappedString
被创建为adapter以使String
适合Scala集合库,并添加了隐式转换以使其几乎无缝。