Scala 将HList转换为HMap[Int,TypeTag[]]的无形状
让我们假设下面的代码Scala 将HList转换为HMap[Int,TypeTag[]]的无形状,scala,shapeless,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[
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]
如果运行上述代码,您可以看到这两个cast返回的内容的差异。
可能听起来很幼稚,但在第一次cast中,我将访问case class A
s成员,因为它的返回类型只是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]
为什么HMap
而不是记录?HMap
s需要指定允许映射的其他类型和隐式。我应该能够解释为什么您的示例不起作用,因为您使用了HMap
的完整代码。此外,该机器的用例可能会有所帮助。我的要求非常简单。我需要一个映射,在获得特定键的值时,我希望它返回TypeTag[a]
,以便我可以强制转换它。示例:hmap.get(1)//应该返回TypeTag[A]
,就像我执行HList.head时HList的返回方式一样。能否为编译但失败的hmap
提供代码?或者你从来没有让它工作过?