Возможно ли в Scala использовать isAssignableFrom с параметрами типа? - PullRequest
1 голос
/ 09 февраля 2011

Я внедряю службу JAX-RS в Scala, используя Джерси. Я хотел бы иметь общую черту для провайдера Json, и мне нужно знать, поддерживается ли запрошенный класс моим провайдером. В Java невозможно узнать класс параметра типа во время выполнения, потому что тип стирается. А можно в скале делать?

Этот код не работает:

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 тоже?

1 Ответ

3 голосов
/ 09 февраля 2011

Для этого есть обходной путь. Вы можете использовать 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)
}
...