这不是一个打字问题。 问题在于 :
val relayData = ser.serialize(relayData).fold(throw _, identity)
您再次在相同行中声明 < code> val relayData code>, 与您引用方法参数 < code> relayData code > 相同。 Scala 编译器不理解您是否拥有/ 想要两个同名变量, 相反, 将它解释为 < code> val relayData code > 的循环定义。 更改其中一个变量的名称应该修正错误 。
不管怎么说,既然你没有完全了解Scala编译员的要求,我认为,如果能向你们说明编译员甚至希望你们做什么,那也是件好事(尽管有人说,如果照办的话,可能会导致你再犯一个错误,而鉴于当时的情况,这个错误似乎不太合理)。
上面写着"递归值 relayData
needs type。"的意思是,它要您简单地指定 relayData
的类型,
val relayData = ...
变成像
val relayData: Serializable = ...
(或者,代替 Sreabable
,使用您想要的 relayData
类型)
它需要这一信息,以便产生一个循环定义。
val x = x + 1
这个代码是... 奇特的, 至少可以说, 但我正在做的是用一种( 赤裸裸的) 递归的方式定义 < code> (code>x code) 。 但有一个问题: 编译者如何知道内部 < code> > x code > 使用哪种类型? 它无法通过类型推理真正确定类型, 因为类型推理涉及利用 < em > other em > 定义的类型信息, 而这个定义需要 < engenchem > > > < x/code > s < em/ / strong > type type 。 现在, < em > we < / em > 也许可以推断我可能正在谈论一个 < code> Int , 但理论上, < code > < x 可能是 < max > 。
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! 它对你也是一样!