这不是真正的打字问题。问题是:
val relayData = ser.serialize(relayData).fold(throw _, identity)
您在val relayData引用方法参数的同一行中声明 a relayData。Scala 编译器不理解您拥有/想要两个具有相同名称的变量,而是将其解释为val relayData. 更改其中一个变量的名称应该可以修复错误。
无论如何,由于您没有完全遵循 Scala 编译器的要求,我认为最好向您填写编译器甚至想要您提供的内容(尽管如果遵循建议,考虑到这种情况,可能只会导致您遇到另一个似乎没有多大意义的错误)。
它说“递归值relayData需要类型”。这意味着它希望您relayData通过具有
val relayData = ...
变成类似的东西
val relayData: Serializable = ...
(或者,代替Serializable,使用您想要的任何类型relayData)
它需要这些信息来创建递归定义。例如,以简单的情况为例
val x = x + 1
这段代码......至少可以说很奇怪,但我正在做的是以x(浅)递归方式定义。但是有一个问题:编译器如何知道内部使用什么类型x?通过类型推断并不能真正确定类型,因为类型推断涉及利用其他定义的类型信息,而这个定义需要x的类型信息。现在,我们或许可以推断出我可能在谈论一个Int,但从理论上讲,x可能是这么多东西!事实上,这是行动中的歧义:
val x: Int = x + 1 // Default value for an Int is '0'
x: Int = 1
val y: String = y + 1 // Default value for a String is 'null'
y: String = null1
真正改变的是类型注释,但结果却截然不同——这只是一个非常简单的例子!所以,是的,总结一下这一切......在大多数情况下,当它抱怨递归值需要类型时,你应该对糟糕的编译器有一些同情,并给它它非常渴望的类型信息。它会为你做同样的事情,DeLongey!它会为你做同样的事情!