Scala classOf для параметра типа: как вызвать функцию и как ограничить ее верхними границами типа - PullRequest
0 голосов
/ 02 августа 2011

Я работаю с JAX-RS в Scala и пытаюсь параметризовать вызов:

val jc = JAXBContext.newInstance(classOf[MyClassName])

Я использую ClassManifests согласно ответу здесь , но у меня естьпара вещей, с которыми я все еще борюсь.В качестве фона все мои представления JAX-RS расширяют класс представления заглушки:

class Representation {}

class ExampleRepresentation extends Representation { ... }

До сих пор я определил свою функцию, используя ClassManifest, вот так:

def get[R: ClassManifest](representation: R): String = {
  val jc = JAXBContext.newInstance(classManifest[R].erasure)
  ...
}

Мой первый вопроснемного глупо: как мне вызвать эту функцию?Я не могу понять, что передать get () для типа R и значения представления (принятый ответ на исходный вопрос не проясняет это).Я пробовал неявную типизацию в соответствии с комментарием парадигмы, но ниже выдает ошибку компиляции:

get(PlatformRepresentation)

Compiling main sources... 
  not found: value PlatformRepresentation

Мой второй вопрос: возможно ли применить верхний предел типа к объекту R?Другими словами, я знаю, что:

R <: Representation

Есть ли способ ограничить это в объявлении типа ClassManifest get ()?

Большое спасибо!

Ответы [ 3 ]

5 голосов
/ 02 августа 2011

Вам нужно подавить аргумент, если у вас его нет:

def get[R <: Representation: ClassManifest]: String = {
    val classManifest = implicitly[ClassManifest[R]] //to retrieve the class manifest
}

Для его вызова:

get[PlatformRepresentation]

Тип указывается в квадратных скобках.

3 голосов
/ 02 августа 2011

По поводу вашего второго вопроса: да, есть способ сделать это:

def get[R <: Representation: ClassManifest](representation: R): String

Когда вы объявляете параметры типа, вы можете включить одну нижнюю границу с >:, одну верхнюю границу с <: и столько же границ контекста (с :) и просмотреть границы (с <%), которые вы необходимо.

1 голос
/ 02 августа 2011

пример:

scala> def b[T <: String : ClassManifest] (t:T) = t + " " + classManifest[T].era
sure;
b: [T <: String](t: T)(implicit evidence$1: ClassManifest[T])java.lang.String

scala> b("hello")
res2: java.lang.String = hello class java.lang.String

РЕДАКТИРОВАТЬ @paradigmatic правильно, в вашем случае это должно быть

scala> def c[T <: String : ClassManifest] = classManifest[T].erasure;
c: [T <: String](implicit evidence$1: ClassManifest[T])java.lang.Class[_]

scala> c[String];
res4: java.lang.Class[_] = class java.lang.String
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...