这不是真正的打字问题。问题是:
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!它会为你做同样的事情!