0

我正在与 ZeroMQ 和 Akka 集成以从不同的实例发送案例类。问题是当我尝试编译这段代码时:

def persistRelay(relayEvent:String, relayData:Any) = {
    val relayData = ser.serialize(relayData).fold(throw _, identity)
    relayPubSocket ! ZMQMessage(Seq(Frame(relayEvent), Frame(relayData)))
  } 

Scala 编译器返回recursive value relayData needs type.

进入的案例类都是不同的,看起来像Team(users:List[Long], teamId:Long)等等。

是否有一种方法可以允许序列化程序中的任何类型或解决方法?除非绝对必要,否则我宁愿避免为每个创建数据的函数编写序列化程序。

谢谢!

4

1 回答 1

3

这不是真正的打字问题。问题是:

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!它会为你做同样的事情!

于 2012-05-25T17:17:49.193 回答