Преобразование класса case в hlist возможно с использованием .productIterator
.
Но преобразование hlist в case-класс возможно либо с помощью макросов (или бесформенных, где макросы используются под капотом), либо написанием таких методов, как
case class MyClass(i: Int, s: String, b: Boolean)
object MyClass {
def from(x: Int :: String :: Boolean :: HNil): MyClass = x match {
case i :: s :: b :: HNil => MyClass(i, s, b)
}
}
для каждого класса дел. Дело в том, что вы не можете написать
def from[T](x: ...): T = new T(...) //pseudocode
без макросов (или отражения).