2011-02-08 59 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

相關問題