2012-05-25 88 views
0

我正在與ZeroMQ和Akka集成來發送來自不同實例的案例類。問題是,當我嘗試編譯此代碼:如何在不指定類型的情況下序列化任何東西?

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

斯卡拉編譯器拋出回recursive value relayData needs type

進入的案例類都是不同的,看起來像等等。

有沒有一種方法允許任何類型的序列化器或解決方法?除非絕對必要,否則我寧願避免爲每個創建數據的函數編寫一個序列化器。

謝謝!

+4

這不是一個真正的打字問題。問題是'val relayData = ser.serialize(relayData).fold(throw _,identity)'。您正在聲明一個'val relayData',它與您引用方法參數'relayData'的同一行中。 Scala編譯器不明白你有/想要兩個具有相同名稱的變量,而是將它解釋爲'val relayData'的遞歸定義。更改其中一個變量的名稱應該修復錯誤。 – Destin

+0

那麼這在我的方面顯然被忽視了。你是對的,它確實修復了它。請添加它作爲答案,以便我可以接受它:) – crockpotveggies

回答

3

這不是確實是輸入問題。問題是:

val relayData = ser.serialize(relayData).fold(throw _, identity) 

你在你正在做的方法參數relayData參考同一行聲明val relayData。 Scala編譯器不知道你有/想要兩個具有相同名稱的變量,而是將其解釋爲val relayData的遞歸定義。更改其中一個變量的名稱應該修復錯誤。無論如何,因爲你沒有完全遵循Scala編譯器的要求,所以我認爲它也可以讓你瞭解編譯器甚至希望從你那裏得到什麼(即使它是建議,如果遵循的話,可能會導致你得到另一個似乎沒有多大意義的錯誤,因爲情況)。

它說「遞歸值relayData需要類型」。這樣做的意義在於,它希望你能簡單地通過具有

val relayData = ... 

成爲像

val relayData: Serializable = ... 

指定relayData類型(或代替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!它會爲你做同樣的事情!

+0

這樣一個驚人的,寫得很好的答案。我可以看到你對此很有樂趣,而且你將來肯定會幫助很多人。 :) – crockpotveggies

相關問題