【发布时间】:2015-06-14 02:33:31
【问题描述】:
考虑一个类如下:
import scala.collection.mutable.{HashMap => MutableHashMap}
class CustomHashMap[K,V](hashMap: MutableHashMap[K,V], initVal: V) {
def addMaps(first: MutableHashMap[K, V], second: MutableHashMap[K, V]): MutableHashMap[K, V] = {
second.foreach(pair => { first += (pair._1 -> (first.getOrElse(pair._1, initVal) + pair._2)) } )
//The above line throws a compile time error
first
}
//Other functions
}
添加两个参数化类型后,会出现编译时错误提示
expected (K,V) recieved (K,String)
我想知道为什么 scala 会进行这种隐式转换?由于在 java 中不允许运算符重载,这似乎是合乎逻辑的,但在 scala V 的情况下,实际上可能是一个可以为它定义方法 + 的类。
【问题讨论】:
-
Scala 不是鸭式语言。
-
V可以是一个有+方法的类,但不能保证一定会!它可能是别的东西。 -
@m-z 那么在scala中没有办法实现这样的功能吗?
-
不清楚你在追求什么。
V应该是数字吗?或者只是有一个+方法?无论哪种方式,它都需要一些约束,例如结构类型或类型类。 -
听起来你想要一个幺半群。在这段代码中,您实际上是在尝试为映射定义幺半群(您的代码结果在概念上与 scalaz 在
first |+| second中所做的相同,但是您使用可变映射并要求为每个操作提供幺半群的零) .