尝试:
(List(('c', 1)).toMap)('c')
错误:
found : Char('c')
required: <:<[(Char, Int),(?, ?)]
然而,这很好用:
val m = List(('c', 1)).toMap
m('c') // gives 1 as expected
为什么首先将它存储在变量中是否重要?这可能是个错误吗?
答案 0 :(得分:6)
问题是toMap
的完整签名如下:
def toMap[T, U](implicit ev: <:<[A, (T, U)]): Map[T, U]
集合API设计者不希望List(1).toMap
进行编译,因此它们要求您提供隐式证据,证明列表的内容是元组。
通常你不必考虑这个 - 你只需要在没有参数的情况下调用toMap
,编译器就会找到隐含的证据。当你写一些看起来像是用参数调用toMap
的东西时,你会遇到麻烦,因为它总是可能明确提供隐式参数。
最简单的解决方法(假设您不想定义单独的变量)是明确调用apply
。 whatever(foo)
只是whatever.apply(foo)
的语法糖(除非whatever
是方法),如果你编写以下内容,你的代码将编译:
scala> List(('c', 1)).toMap.apply('c')
res0: Int = 1
现在很明显,您并没有尝试以toMap
作为参数调用c
方法。