Scala classOf用于类型参数:如何调用函数以及如何使用上限类型限制

时间:2011-08-02 07:47:58

标签: scala

我在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类型声明中绑定它?

非常感谢!

3 个答案:

答案 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