Scala中的异构映射,是否可能?

3

问题出在标题上。以下是一些解释: 我们知道,可以使用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
@user3127060,您能否提出一个单独的问题或提供更多信息? - DaunnC
2个回答

1

谢谢回复,我尝试使用隐式转换来处理shapeless的HMap,但是它会抛出错误(请参考我上面帖子中的示例,在edited2之后);我尝试创建类似于以下代码的东西:val hmap = ("string1" ->> 3) :: ("string2" ->> true) :: ("string3" ->> boolean) :: HNil; hmap("string1");也许这会有所帮助,我稍后会测试一下,也许适合我:) 我会写下结果。 - DaunnC

0
那个对象类型和数量未知。 显然,您不能使用编译时类型信息... 您需要动态重构类型,例如使用模式匹配。

嗯,当然在编译之前它们是已知的,但我的意思是我们没有可能为shapeless的HMap(对于BiMapIS)手动编写所有隐式类型转换。顺便说一下,你也许回答了我的问题,我是个白痴,也许我应该并且可以编写隐式转换。 - DaunnC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接