2011-02-08 33 views
1

我正在使用Jersey在Scala中实现JAX-RS服务。我想为Json提供者提供一个通用特征,并且我需要知道提供者是否支持请求的类。在java中,不可能在运行时知道类型参数的类,因为类型擦除。但是在scala中可以做到吗?是否有可能在Scala中将isAssignableFrom与类型参数一起使用?

此代码不起作用:

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的类?

回答

3

对此有解决方法。您可以使用Manifest类型的类。通过使用它,Scala编译器将确保该类信息在运行时可用。 Manifesterasure属性 - 它是泛型类的类对象。

你可以使用它的方法的类型参数是这样的:

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) 
} 
+0

是的,我只是指出这是不可能使用特质,因为隐式构造函数的参数。 – 2011-02-09 00:51:38

相关问题