var temp = 5
val map = new HashMap[String,Array[Integer]]()
if(map contains str1){
map(str1) = map(str1) :+ temp
}else{
map(str1) = Array(temp)
}
基本上如果键不在地图中,我想将值设置为值为temp的新数组,如果键已经在地图中,我想将temp附加到现有数组的末尾。 temp是一个整数。
执行上述代码时,我收到以下错误:
helloworld.scala:21: error: type mismatch;
found : Array[Any]
required: Array[Integer]
Note: Any >: Integer, but class Array is invariant in type T.
You may wish to investigate a wildcard type such as `_ >: Integer`. (SLS 3.2.10)
map(str1) = (map(str1) :+ temp)
^
我是新scala,所以我完全不知道为什么会这样。谢谢你的帮助。
答案 0 :(得分:0)
此代码存在两个问题。我假设您首先使用可变HashMap
,因为否则无法更新它。
首先,您收到编译错误,因为您已声明HashMap[String, Array[Integer]]
,但您尝试将Int
附加到Array[Integer]
。它们不是同一件事。因此,编译器将类型推断为Any
,这是不允许的,因为Array
的类型参数是不变的。
因此,请将您的声明更改为val map = new HashMap[String,Array[Int]]()
。在scala中使用Integer
没有多大理由。如果你真的需要使用val temp = new Integer(5)
,而不是。
您从第一个编译器中看不到的第二个问题是这不起作用:
map(str1) = Array(temp)
如果str1
上不存在HashMap
密钥,则调用map(str1)
将引发异常,因此无法以这种方式分配新密钥。相反,您必须将键值对添加到地图中,如下所示:
map += (str1 -> Array(temp))