为什么scalac抱怨方法+;用绳子?
给定以下Scala代码:为什么scalac抱怨方法+;用绳子?,scala,types,Scala,Types,给定以下Scala代码: 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 ac
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
}
}
为什么我会收到以下错误消息:
error: too many arguments for method +: (other: String)java.lang.String
actualMessages += (contentType, payload)
具体来说,有效负载在IDEA中突出显示,在命令行上,+=突出显示。我真的不明白那个错误消息。创建带有附加元素的新列表的方法实际上是
:+
。要使用附加版本更新列表var
,需要执行以下操作:
actualMessages :+= (contentType, payload)
或者你可以用
actualMessages +:= (contentType, payload)
// or, equivalently,
// actualMessages ::= (contentType, payload)
(对于大列表,预结束实际上更可取,因为它是O(1)而不是O(n)用于追加。一种策略是使用预结束反向构建列表,然后在结束调用时list.reverse
)
使用您尝试使用的+
运算符,Scala认为您需要进行字符串连接
scala> List("hello") + " world"
res0: java.lang.String = List(hello) world
这是Java遗留下来的一个不幸的问题。泛型字符串连接在Scala中使用中定义的隐式转换实现
发生的情况是,
List
没有实现+
方法,因此编译器会查找到提供+
的转换,并查找any2stringad
。例如,true+“false”
就是这样工作的。编译器可能很难推断。我怀疑字符串是一个列表[字符]?我不理解你的问题,但我给出了更多关于+
如何被解释为类型Any
@François的泛型字符串串联的细节:在Scala中,String
是一种独特的类型,而不是List[Char]
的同义词。是的,String
是java.lang.String
的缩写。但是Scala有一些隐含的功能,允许您将字符串
当作Seq[Char]
来处理。例如,“hello”.map(u.toInt)
计算为向量(104101108108111)
。
implicit def any2stringadd (x: Any): StringAdd