2011-09-18 5 views
2

:왜 scalac이 String에 대해 method +에 대해 불평하고 있습니까? 다음 스칼라 코드를 감안할 때

error: too many arguments for method +: (other: String)java.lang.String 
actualMessages += (contentType, payload) 

특히, 페이로드는 IDEA에서 강조하고 명령 줄에, + =이 강조 : 나는 다음과 같은 오류 메시지가 무엇입니까 왜

def stream(callback: (String, Array[Byte]) => Unit) { 
    callback("application/json;charset=utf-8", Array(1)) 
    callback("application/xml;charset=utf-8", Array(1)) 
} 

@Test 
def whenStreaming_thenShouldSeeSameMessages() { 
    var actualMessages = List.empty[(String, Array[Byte])] 
    sut.stream { 
     (contentType, payload) => 
      actualMessages += (contentType, payload) 
    } 

    expect(List("application/json;charset=utf-8", "application/xml;charset=utf-8")) { 
     actualMessages 
    } 
} 

. 나는 그 오류 메시지를 정말로 이해하지 못한다.

답변

6

추가 된 요소로 새 목록을 만드는 방법은 실제로 :+입니다. 추가 된 버전으로 목록 var를 업데이트하려면, 당신이해야 할,

actualMessages :+= (contentType, payload) 

또는 당신이 앞에 추가 할 수

actualMessages +:= (contentType, payload) 
// or, equivalently, 
// actualMessages ::= (contentType, payload) 

는 O이기로 (큰 목록의 경우, prepending이이 사실 바람직하다 (1) 하나의 전략은 목록을 역순으로 작성하기 위해 prepending을 사용하고 마지막 호출시 List.reverse을 호출하는 것입니다.

+ 연산자를 사용하면 스칼라는 문자열 연결을 원한다.

scala> List("hello") + " world" 
res0: java.lang.String = List(hello) world 

이것은 Java에서 발생하는 불행한 캐롤 오버입니다. 일반 문자열 연결은 무슨 일

implicit def any2stringadd (x: Any): StringAdd 

List+ 방법을 구현하지 않는다는 것입니다, scala.Predef에 정의 된 암시 적 변환을 사용하여 스칼라에서 구현되기 때문에 컴파일러는 + 제공하지 않습니다 뭔가 변환에 대한보고, 발견 any2stringadd. 이 방법은 예 : true + " false"입니다.

+0

아마 컴파일러가 추측하기가 어렵습니다. 나는 String이 List [Character]라고 생각한다. –

+0

나는 당신의 질문을 이해하지 못하지만,'+'가'Any' 타입에 대한 일반적인 문자열 연결로 해석되는 방법에 대해 더 자세히 설명했습니다. –

+0

@ François : 스칼라에서'String'은 뚜렷한 타입이고'List [Char] '의 동의어는 아닙니다. – missingfaktor

관련 문제