Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么scalac抱怨方法+;用绳子?_Scala_Types - Fatal编程技术网

为什么scalac抱怨方法+;用绳子?

为什么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

给定以下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 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