尝试:

(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的内容时,您会遇到麻烦,因为始终可以显式提供隐式参数。

最简单的解决方法(假设您不想定义单独的变量)是显式调用applywhatever(foo)只是whatever.apply(foo)的语法糖(除非whatever是一种方法),如果编写以下代码,则将编译代码:

scala> List(('c', 1)).toMap.apply('c')
res0: Int = 1


现在非常清楚,您没有尝试使用toMap作为参数调用c方法。

09-12 09:10