2012-08-11 2 views
6

스칼라 코드를 작성하는 동안 코드를 컴파일 할 때 이상한 오류 메시지가 표시됩니다. 나는 코드를 훨씬 단순한 것으로 분해했다 (의미 론적 관점에서 전혀 의미가 없지만 여전히 오류를 보여줌).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 
    } 
} 

// 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에 무슨 문제가 있습니까?

UPDATE : 당신은 행동에 this bug을보고있는

+0

이것은 아마도 버그 일 수 있습니다. 2.10에서는 잘 작동합니다. – sschaef

답변

6

스칼라 2.9.2로 테스트. 2.10에서 수정되었으며 쉬운 해결 방법이 있습니다 this answer- 어딘가에 유형 특수 효과를 추가하십시오.

for (i <- 1 to 2) { 
    map.get(0) match { 
    case None => map += (1 -> ListBuffer[Int](1)) 
    case Some(l: ListBuffer[Int]) => (l += i): Unit 
    } 
} 
+0

이 점을 지적 해 주셔서 대단히 감사합니다. –

관련 문제