如何从多态类型字段加载隐式Manifest

时间:2016-11-10 23:00:24

标签: scala scala-reflect scala-generics

我正在尝试为我的ADT构建一个解释器,但我不知道如何解决以一种很好的方式加载隐式清单的问题

sealed trait Polymorphic[T]
case class Type1[T: Manifest](field1: T) extends Polymorphic[T]
case class Type2[T: Manifest, V: Manifest](field1: T, field2:V) extends Polymorphic[T] {
    def vManifest: Manifest[V] = manifest[V]
}

object Interpreter {
    def eval[T: Manifest](polymorphic: Polymorphic[T]): T = {
      polymorphic match {
        case Type1(field) =>
          ???
        case value: Type2[T, _] =>
          implicit val vManifest = value.vManifest
          evalType2(value)
      }
    }

    def evalType2[T:Manifest, V:Manifest](type2: Type2[T,V]): T = ???
}

这是我可以创建的最佳解决方案,但我不喜欢我必须创建vManifest函数才能在eval中加载清单。

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

记住T: Manifest只是编写隐式构造函数参数的简便方法。如果您想让这个参数对外界可见,只需将其设为val

即可
case class Type1[T](field1: T)(implicit val tManifest: Manifest[T]) extends Polymorphic[T]
case class Type2[T](field1: T, field2: V)(implicit val tManifest: Manifest[T], val vManifest: Manifest[V]) extends Polymorphic[T]

(现在很可能,您需要ClassTagTypeTag而不是Manifest。)