1

我想创建一个从 Class[A] 到 A 的 HMap,但我找不到一种看起来不难看的方法。我试过了:

val defaultValues = HMap[(Class ~?> Id)#λ](
    classOf[String] -> "",
    classOf[Int] -> 0)

但我得到一个编译错误,因为 Class[String], String 没有隐式。我可以通过使用 Id 显式键入参数来编译它:

val defaultValues = HMap[(Class ~?> Id)#λ](
    classOf[String] -> ("": Id[String]),
    classOf[Int] -> (0: Id[Int]))

不过,它并不是很有吸引力-有没有一种方法可以在不需要“:Id [A]”的情况下做到这一点?

4

1 回答 1

0

HMap 使用隐含的证据来证明您可以将键/值对放入映射中。您必须在构建 HMap 或将值放入其中或从中获取值时将所需的约束编码为可用的隐式约束。

import shapeless.HMap

class HMapExample {

    class InstanceOfConstraint[K, V]

    implicit def instanceOfClass[T] = new InstanceOfConstraint[Class[T], T]

    val defaultValues = HMap[InstanceOfConstraint](
      classOf[String] -> "Hello",
      classOf[Int] -> 23
    )
}

应该做你需要的。

于 2014-10-07T12:16:07.000 回答