【问题标题】:Making Generics in Shapeless 2.0.0在 Shapeless 2.0.0 中制作泛型
【发布时间】: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 怎么办?)

【问题讨论】:

    标签: scala shapeless


    【解决方案1】:

    对于一个普通的旧 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] 才会作为值起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多