6

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) {
                          ^

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))

おそらく、match-case-statementの戻り値と関係があると思います。しかし、私はScalaではありません-このエラーメッセージの背後にある理由と私が間違っていることを理解するのに十分な専門家ではありません。もっと賢い人がここで助けてくれることを願っています。

エラーメッセージの背後にある理由は何ですか?match-case-statementの何が問題になっていますか?

更新:Scala2.9.2でテスト済み

4

1 に答える 1

6

このバグが実際に発生しています。これは 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
  }
}
于 2012-08-11T18:43:51.820 に答える