如何使用抽象类型的清单

时间:2014-10-09 23:00:54

标签: scala manifest

使用带抽象类型的清单时出现编译错误:

[error] No Manifest available for C#MV#A.
[error]     def readGenSingle4[C <: MultiItemValue](h: Seq[C#MV] => C, json: JValue, g:    (C#MV#A, Seq[Criteria.MatchCriteria]) => C#MV, f: JValue => C#MV#A = {v: JValue => v.extract[C#MV#A]})(implicit m: Manifest[C#MV#A]) =

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:0)

不推荐使用清单 - 请改用ClassTag / TypeTag。你实际上不需要在你的函数中捕获ClassTag / TypeTag - 你可以在你的类中执行它(这是唯一的方法,因为只有类可以在运行时捕获它的抽象类型):

trait MV{type A; implicit val t: TypeTag[A]}

class MVString(implicit val t: TypeTag[String]) extends MV {type A = String}

之后 - 您甚至可以在函数内部访问TypeTag作为成员(new MVString).t。唯一的问题是您必须为每个实现明确指定typeTag。可能的解决方案 - 将泛型与抽象类型结合使用:

abstract class MV[T](implicit val t: TypeTag[T]){type A = T}

class MVString extends MV[String]

scala> def readGenSingle4[C <: MV[T], T](a: C, b: C#A ) = a.t
readGenSingle4: [C <: MV[T], T](a: C, b: T)reflect.runtime.universe.TypeTag[T]

scala> readGenSingle4(new MVString, "aaaa")
res4: reflect.runtime.universe.TypeTag[String] = TypeTag[String]