无形地将HList转换为HMap [Int,TypeTag [_]]

时间:2017-07-12 10:14:19

标签: scala shapeless

让我们假设以下代码,

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]

0 个答案:

没有答案