在Shapeless 2.0.0中制作泛型

时间:2014-10-23 21:54:33

标签: scala shapeless

我想使用Shapeless 2.0.0执行以下操作:

  def freeze[T]( o:T ) = {
   val gen = Generic[T]
   gen.to(o)
  }

这给了我一个错误,说T不是案例类或特征。有没有办法做到这一点? (我可以做val gen = Generic [Foo]。那很好,但是如果我需要能够从编译时不知道的东西构建Generic呢?)

1 个答案:

答案 0 :(得分:4)

对于普通的T,您无法做任何有趣的事情 - Shapeless中的大多数操作都要求您以隐式参数的形式提供有关类型的某种证据,如下所示:

import shapeless.Generic

def freeze[T](o: T)(implicit gen: Generic[T]) = {
  gen.to(o)
}

然后:

scala> case class Foo(i: Int)
defined class Foo

scala> freeze(Foo(10))
res0: shapeless.::[Int,shapeless.HNil] = 10 :: HNil

唯一的时间Generic[T]将作为值工作,当编译器具体知道T是什么时。