如何在需要Manifest类型时使用匿名类型

时间:2014-05-15 09:26:57

标签: scala

我不熟悉Manifest类型。 Jackson库使用这种类型,即在ObjectMapper中。所以给出了这个方法:

def fromJson[T: Manifest](jsonInputStream: InputStream): T

我试图用匿名类型调用它:

....fromJson[{val numRounds: Int; val numSeconds: Int }](json)

但是我遇到了编译错误。

[error]  found   : scala.reflect.Manifest[Object]
[error]  required: Manifest[AnyRef{val numRounds: Int; val numSeconds: Int}]
[error] Note: Object >: AnyRef{val numRounds: Int; val numSeconds: Int}, but trait Manifest is invariant in type T.
[error] You may wish to investigate a wildcard type such as `_ >: AnyRef{val numRounds: Int; val numSeconds: Int}`. (SLS 3.2.10)
[error]           val d = jsonParser.fromJson[{val numRounds: Int; val numSeconds: Int}](json)

有人可以解释这个问题吗?我真的必须为该类型创建一个合适的类吗?

1 个答案:

答案 0 :(得分:2)

我已在Manifest error for anonymous type中回答了您的问题:

  

Looks like清单不可能。你应该用   而是TypeTag。像这样:

import scala.reflect.runtime.universe._
object GenericSerializer
{
  def apply[T <:AnyRef]()(implicit tag: TypeTag[T]) = {}
}