尝试:
(List(('c', 1)).toMap)('c')
错误:
found : Char('c')
required: <:<[(Char, Int),(?, ?)]
但是,这很好用:
val m = List(('c', 1)).toMap
m('c') // gives 1 as expected
是否先将其存储在变量中为什么会很重要?这可能是错误吗?
最佳答案
问题在于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
方法。