【发布时间】:2014-10-23 21:54:32
【问题描述】:
我想使用 Shapeless 2.0.0 执行以下操作:
def freeze[T]( o:T ) = {
val gen = Generic[T]
gen.to(o)
}
这给了我一个错误,说 T 不是案例类或特征。有没有办法做到这一点? (我可以做 val gen = Generic[Foo]。这很好,但是如果我需要能够从编译时未知的东西构建一个 Generic 怎么办?)
【问题讨论】:
我想使用 Shapeless 2.0.0 执行以下操作:
def freeze[T]( o:T ) = {
val gen = Generic[T]
gen.to(o)
}
这给了我一个错误,说 T 不是案例类或特征。有没有办法做到这一点? (我可以做 val gen = Generic[Foo]。这很好,但是如果我需要能够从编译时未知的东西构建一个 Generic 怎么办?)
【问题讨论】:
对于一个普通的旧 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
只有当编译器知道 T 是什么时,Generic[T] 才会作为值起作用。
【讨论】: