2015-11-10 85 views
2

請注意我正在學習斯卡拉,所以我建議可能不是最好的(idomatic)的方式來實現這一點,因此我會描述我試圖解決的問題,然後我的目前的實施!斯卡拉數據結構類型安全訪問器

問題:給定一些輸入文檔,例如xml或json,創建一個對象Doc,其原始內容作爲變量,應用一系列FieldExtractors,該序列提取多個值,即Fields,這些值存儲在Doc對象上,並且可以稍後以類型安全的方式訪問。 val username: String = doc.getField(UsernameField)

NB一切都必須是可序列化,因此可以在導線通過一個特定的框架內通過

所以,我目前的嘗試:

abstract class Field[+T <: Serializable](val name: String, val valueType: Class[T]) 

trait Fields { 
    var fields: mutable.HashMap[Class[Field[Serializable]], Field[Serializable]] = mutable.HashMap() 
    def hasField[T <: Serializable](field: Field[T]): Boolean = false 
    def getField[T <: Serializable](field: Field[T]): T = fields.get(field).asInstanceOf(T) 
    def setField[T <: Serializable](field: Field[T], value: T): Unit = fields.put(field, value) 
} 

class Doc(val rawData: String) with Fields 

abstract class FieldExtractor[+TYPE <: Serializable](val field: Field[TYPE]) { 
    def extractField(input: Doc): Option[TYPE] 
} 

但我得到的所有類型的錯誤,如:

我想知道如果也許我應該使用值類型?或者https://github.com/mikaelv/strucs項目(這看起來很年輕)?或者是否有更好的方法?

最後我喜歡寫東西

extractors.foldLeft(doc)((doc, extractor) => doc.setField(field, extractor.extractField(doc); doc 

回答

3

這似乎是有自己的Serializable類斯卡拉的症狀。

String(它斯卡拉使用作爲java.lang.String的同義詞)實現Java的java.io.Serializable而你Field類已宣佈採用Scala的Serializable類的一般界限。

如果更改聲明如下:

abstract class Field[+T <: java.io.Serializable](val name: String, val valueType: Class[T]) 

它編譯*和使用Scala的SDK 2.11.7不正確的類型安全的get/set檢查我(*,我不得不糾正一些輕微的拼寫錯誤)。

請注意,Fields類中也存在錯誤。我想你的意思是宣佈散列圖爲:

fields: mutable.HashMap[Field[Serializable], Serializable]