請注意我正在學習斯卡拉,所以我建議可能不是最好的(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