有人可以解释为什么在apply()
map()
scala> val l = List(1, 2, 3)
l: List[Int] = List(1, 2, 3)
scala> l(2)
res56: Int = 3
scala> l.map(x => x*2)
res57: List[Int] = List(2, 4, 6)
scala> l.map(x => x*2)(2)
<console>:9: error: type mismatch;
found : Int(2)
required: scala.collection.generic.CanBuildFrom[List[Int],Int,?]
l.map(x => x*2)(2)
^
scala> l.map(x => x*2).apply(2)
res59: Int = 6
感谢。
答案 0 :(得分:7)
这是因为map
方法采用带有implicit
隐式参数的第二个CanBuildFrom
参数列表:
def map[B, That](f: (A) ⇒ B)(implicit bf: CanBuildFrom[List[A], B, That]): That
Scala编译器会解释您的代码,就好像您尝试将2
传递给需要隐式CanBuildFrom
的地方一样。
使用CanBuildFrom
和丑陋的方法签名是Scala集合库中一个非常有争议的元素,经常被讨论和批评。
这里的另一个问题是Scala允许显式传递隐式参数。我个人认为不应该允许它,然后我们可以避免许多类似于你的问题。但这当然是一个意见问题。