问题出在标题上。以下是一些解释:
我们知道,可以使用HList
来存储带有其类型的对象。
SomeCL[Int], SomeCL[String], SomeCL[MyType1] :: ... :: HNil
其中SomeCL
是一个类。我想要创建一个可以存储其内所有类型信息的映射表,就像这样:
// it is wrong usage of HMap, it is an example of how I want it be
HMap("string1" -> SomeCL[Int], "string2" -> SomeCL[MyType1], ... )
为了不丢失类型信息。需要注意的是,对象类型和数量未知,因此我们不能为本地形状的HMap使用许多隐式。这可能吗?
编辑:
(我的意思是我们没有可能为shapeless HMap手动编写所有隐式类型转换)
附注:
如果不可能,我该如何解决这个问题:例如,我在HList中有一些对象,并构建图形。每个节点的类型非常重要(我们从HList中的对象创建节点),我不知道对象的数量。我如何构建图形,而不会丢失类型信息?
编辑2:
顺便说一下,如果S是A和C的超类型,则此代码将引发错误; 我们如何避免这种情况?
class SomeCL[T](val l: T) {
}
class NodeMap[K, V]
implicit val si = new NodeMap[String, SomeCL[A]]
implicit val sd = new NodeMap[String, SomeCL[S]]
implicit val sb = new NodeMap[String, SomeCL[C]]
val hm = HMap[NodeMap]("foo" -> new SomeCL(new A), "bar" -> new SomeCL(new S), "lol" -> new SomeCL(new C))
SomeCL[T]
有点更复杂(例如,它有一个 HMap),因此我无法手动创建 implicits :) 如果编译器可以推断出来就好了。 - user3127060