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での最良の方法は、ScalaでもAのクラスを返す保護された抽象メソッドを持つことです。

4

1 に答える 1

3

これには回避策があります。Manifest型クラスを使用できます。これを使用することで、Scalaコンパイラーはクラス情報が実行時に利用可能になることを確認します。Manifestプロパティがありerasureます-ジェネリック型のクラスオブジェクトです。

次のようなメソッドの型パラメータに使用できます。

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 に答える