我有以下的設置,在這裏我想的baseData
一個實例複製到的moreData
:斯卡拉:複製一個通用的案例類到另一個
sealed trait baseData {
def weight: Int
def priority: Int
}
sealed trait moreData {
def weight: Int
def priority: Int
def t: String
def id: String
}
case class data1(override val weight: Int, override val priority: Int) extends baseData
case class moreData1 (override val weight:Int, override val priority: Int, override val t: String, override val id: String)extends moreData
所以複製myData
到下面otherData
:
val myData = data1(1,1)
val otherData = moreData1 (2,2,"C","abcd")
將產生:moreData1(1,1,"C","abcd")
。
要做到這一點,我想用一個函數具有以下簽名,因爲我將不得不延長兩baseData
和moreData
不止一例類:
def copyOver[A <:baseData, B <:moreData](from: A, to: B) = {}
我相信你一定能做到這一點Shapeless,但還沒有想出如何。有一些例子(here)複製延伸相同特徵的案例類,其他例子(here)通過通用表示法在不同案例類之間映射值。但我還沒有想出如何使用LabelledGeneric
與傳遞到copyOver
的特徵有限的參數。我也不想對otherData
中的myData
中不存在的額外字段進行硬編碼。
我正在尋找一個完全通用的實現。有任何想法嗎?
謝謝,超級有用!最後一個障礙是,我收到以下編譯錯誤:'在調用copyOver時,無法找到參數更新的隱式值:cmd23.UpdateRepr [cmd19.moreData1,R] copyOver(myData,otherData)'。任何想法爲什麼? –
如果您嘗試使用REPL,請嘗試一次性使用具有密封特徵,案例類別和'UpdateRepr'的'Ctrl + P'。 –
啊,是的,它適用於在粘貼模式下一次性複製全部內容。謝謝! 最後一個問題:如果我正確理解'UpdateRepr','baseData'必須是'moreData'的一個確切的子集才能工作。含義'baseData'不能有'moreData'中不存在的任何字段。你會同意嗎? –