我是Scala的新手,我在下面有疑问。
def test() {
var mapObj = Map(1->'a',"Add"->((x:Int,y:Int)=>(x+y)))
mapObj("Add")
}
test()
如何使用参数x:1和y:2调用方法“Add”,然后得到结果3 ???
很多感谢您的亲切帮助,等待您的回答^ _ ^
答案 0 :(得分:0)
如果没有键值对1 -> 'a'
,这很简单。
scala> var mapObj = Map("Add"->((x:Int,y:Int)=>(x+y)))
mapObj: scala.collection.immutable.Map[String,(Int, Int) => Int] = Map(Add -> <function2>)
scala> mapObj.get("Add").get.apply(1,2)
res0: Int = 3
如果键和值的键不同类型Int
和String
以及值的Char
和Function2
,则类型推断器使用最常见的超类型是Any
。然后你会得到难以使用的类型Map[Any, Any]
。
尝试使键具有相同的类型,并且值具有相同的类型。类型推断器完成其余的工作,您可以使用上面的代码。
答案 1 :(得分:0)
问题是您的mapObj
类型为Map[Any,Any]
,因此mapObj("Add")
会返回Any
类型的元素(实际上是Function2)。因此编译器不允许您将其用作函数。您需要将其转换为Function2然后使用它。
scala> val mapObj = Map(1->'a',"Add"->((x:Int,y:Int)=>(x+y)))
mapObj: scala.collection.immutable.Map[Any,Any] = Map(1 -> a, Add -> <function2>
)
scala> mapObj("Add")
res8: Any = <function2>
scala> mapObj("Add").asInstanceOf[scala.Function2[Int,Int,Int]](1,2)
res9: Int = 3
为避免这一切,建议您从地图中排除1->'a'
,并将地图设为Map[Int, Function]