我在Scala中使用JAX-RS并尝试将调用参数化为:
val jc = JAXBContext.newInstance(classOf[MyClassName])
我根据答案here一直在使用ClassManifests,但还有一些我仍在努力的事情。作为背景,我的JAX-RS表示都扩展了一个存根的Representation类:
class Representation {}
class ExampleRepresentation extends Representation { ... }
到目前为止,我已经使用ClassManifest定义了我的函数,如下所示:
def get[R: ClassManifest](representation: R): String = {
val jc = JAXBContext.newInstance(classManifest[R].erasure)
...
}
我的第一个问题有点愚蠢:如何调用此函数?我无法弄清楚传入什么来获取R类型和表示值的get()(原始问题的接受答案并未明确)。我根据范例的注释尝试了隐式类型,但下面会生成编译错误:
get(PlatformRepresentation)
Compiling main sources...
not found: value PlatformRepresentation
我的第二个问题是:是否可以在R对象上应用上限类型?换句话说,我知道:
R <: Representation
有没有办法在get()的ClassManifest类型声明中绑定它?
非常感谢!
答案 0 :(得分:5)
如果你没有参数,你需要压制参数:
def get[R <: Representation: ClassManifest]: String = {
val classManifest = implicitly[ClassManifest[R]] //to retrieve the class manifest
}
要打电话:
get[PlatformRepresentation]
类型位于方括号之间。
答案 1 :(得分:3)
关于你的第二个问题:是的,有办法做到这一点:
def get[R <: Representation: ClassManifest](representation: R): String
声明类型参数时,可以包含一个带>:
的下限,一个上限带<:
,以及多个上下文边界(带:
)和视图边界(带有<%
)你需要的。
答案 2 :(得分:1)
一个例子:
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