2

我正在使用 Jersey 在 Scala 中实现 JAX-RS 服务。我想为 Json 提供者提供一个通用特征,我需要知道我的提供者是否支持请求的类。由于类型擦除,在 java 中不可能在运行时知道类型参数的类。但是有可能在scala中做吗?

此代码不起作用:

trait JsonProvider[A] extends MessageBodyReader[A] with MessageBodyWriter[A] {

  final def isReadable(t : Class[_],
             genericType: Type,
             annotations: Array[Annotation],
             mediaType: MediaType): Boolean = {
    t.isAssignableFrom(classOf[A]) && mediaType == MediaType.APPLICATION_JSON_TYPE
  }
}

有什么建议吗?在 Java 中,最好的方法是让受保护的抽象方法返回 A 的类,在 Scala 中也是如此吗?

4

1 回答 1

3

有解决方法。您可以使用Manifest类型类。通过使用它,Scala 编译器将确保类信息在运行时可用。Manifesterasure属性 - 它是泛型类型的类对象。

您可以将它用于方法的类型参数,如下所示:

def printClass[T](implicit ev: Manifest[T]) =
  println(ev.erasure.getSimpleName)

或简化:

def printClass1[T: Manifest] =
  println(manifest[T].erasure.getSimpleName)

您也可以将它用于类或抽象类:

class Printer[T: Manifest] {
  def printName = println(manifest[T].erasure.getSimpleName)
}

不幸的是,您不能将其用于特征。

编辑:作为解决方法,您可以像这样定义特征:

trait Printer[T] {
  def printName(implicit ev: Manifest[T]) =
    println(ev.erasure.getSimpleName)
}
于 2011-02-09T00:34:10.773 回答