У меня есть следующая настройка, где я хочу скопировать экземпляр 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")
.
Для этого я хочу использовать функцию со следующей сигнатурой, потому что у меня будет более одного класса case, расширяющего как baseData
, так и moreData
:
def copyOver[A <:baseData, B <:moreData](from: A, to: B) = {}
Я уверен, что вы можете сделать это с помощью Shapeless. , но не понял как. Примеры есть (здесь) при копировании классов case, расширяющих ту же черту, и других (здесь), сопоставление значений между различными классами case через универсальное представление. Но я не понял, как использовать LabelledGeneric
с аргументами, ограниченными типажами, переданными в copyOver
. Я также не хочу жестко кодировать дополнительные поля в otherData
, которых нет в myData
.
Я ищу полностью общую реализацию. Любые идеи?