在我编写一些Scala代码时,我在尝试编译代码时收到了一条奇怪的错误消息.我将代码分解为一个更简单的代码(从语义的角度来看根本没有任何意义,但仍然显示错误).
scala> :paste
// Entering paste mode (ctrl-D to finish)
import scala.collection.mutable.ListBuffer
val map = scala.collection.mutable.Map[Int, ListBuffer[Int]]()
for (i <- 1 to 2) {
map.get(0) match {
case None => map += (1 -> ListBuffer[Int](1))
case Some(l: ListBuffer[Int]) => l += i
}
}
// Exiting paste mode, now interpreting.
<console>:12: error: type arguments [Any] do not conform to trait Cloneable's t
pe parameter bounds [+A <: AnyRef]
for (i <- 1 to 2) {
^
Run Code Online (Sandbox Code Playgroud)
在for循环的末尾添加额外的行时,代码可以工作:
scala> :paste
// Entering paste mode (ctrl-D to finish)
import scala.collection.mutable.ListBuffer
val map = scala.collection.mutable.Map[Int, ListBuffer[Int]]()
for (i <- 1 to 2) {
map.get(0) match {
case None => map += (1 -> ListBuffer[Int](1))
case Some(l: ListBuffer[Int]) => l += i
}
1 // <- With this line it works
}
// Exiting paste mode, now interpreting.
warning: there were 1 unchecked warnings; re-run with -unchecked for details
import scala.collection.mutable.ListBuffer
map: scala.collection.mutable.Map[Int,scala.collection.mutable.ListBuffer[Int]]
= Map(1 -> ListBuffer(1))
Run Code Online (Sandbox Code Playgroud)
我猜,它与match-case-statement的返回值有关.但我不是Scala专家,足以弄清楚这个错误信息背后的原因以及我做错了什么.我希望,更聪明的人可以在这里提供帮助.
错误消息背后的原因是什么?match-case-statement有什么问题?
更新:使用Scala 2.9.2进行测试
你看到这个bug在行动了.它已在2.10中修复,并且在这个答案中有一个简单的解决方法 - 只需在某处添加类型注释:
for (i <- 1 to 2) {
map.get(0) match {
case None => map += (1 -> ListBuffer[Int](1))
case Some(l: ListBuffer[Int]) => (l += i): Unit
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
164 次 |
| 最近记录: |