让我们假设以下代码,
import scala.reflect.runtime.universe._
import shapeless._
trait Base
case class A() extends Base
case class B() extends Base
case class C() extends Base
val tt = List(typeTag[A], typeTag[B], typeTag[C])
val tts = typeTag[A] :: typeTag[B] :: typeTag[C] :: HNil
cast(A(), tts.head)
case(A(), tt.head) //res1: Product with Serializable with Base = A()
def cast[A](a: Base, tt: TypeTag[A]): A = a.asInstanceOf[A]
如果你运行上面的代码,你可以看到两个演员返回的差异。
可能听起来很天真,但是在第一次演员时,我会访问case class A
个成员,因为它的返回类型只是A,但不是普通列表的情况。
我同意无形HList使它们成为可能,是否有可能对HMap做同样的事情?
例如: val hmap = HMap(1 - > typeTag [A],2 - > typeTag [B],3 - > typeTag [C])
当我尝试hmap.get(1)
时,它会返回TypeTag[A]
,类似于我tts.head
此外,当我执行cast(A(), tts.head)
时它运行正常,但当我执行cast(A(), tts(0))
时它会失败。
工作表中的返回签名看起来都相同
tts(0) //res2: reflect.runtime.universe.TypeTag[A] =
TypeTag[A$A151.this.A]
tts.head //res3: reflect.runtime.universe.TypeTag[A] =
TypeTag[A$A151.this.A]