使用带抽象类型的清单时出现编译错误:
[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]) =
有没有办法解决这个问题?
答案 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]