2016-11-28 5 views
1

Hey ich versuche, unten Code in bestmöglicher Weise in scala zu schreiben, bitte hilf mir, wenn es einen besseren Weg gibt!Scala Klasse Klasse als Argument übergeben

public final <T> T deserialize(String jsonString, Class<T> klass) { 
    try { 
     return objectMapper.readValue(jsonString, klass); 
    } catch (Exception e) { 
     LOG.error("Failed to deserialize {} to class {}, {}", jsonString, klass, e); 
    } 
    return null; 
} 

Ist unter einem guten?

def deserialize[T: Manifest](value: String): T = { 
    mapper.readValue(value, typeReference[T]) 
    } 
+1

'Manifest' ist veraltet. Verwende 'TypeTag' – Falmarri

Antwort

3

Wenn Sie eine Class[T] erhalten müssen, verwenden Sie scala.reflect.ClassTag (nicht TypeTag; Sie können die Class von ihm zu bekommen, aber nur in einem Umwegen):

def deserialize[T](value: String)(implicit tag: ClassTag[T]): T = { 
    mapper.readValue(value, tag.runtimeClass.asInstanceOf[Class[T]]) 
} 

Achten Sie darauf, den Typ-Parameter nicht zu vergessen, wenn Sie anrufen (zB deserialize[String]("\"a\""), nicht deserialize("\"a\"")), oder Scala wird darauf schließen, dass es Nothing ist.

Es ist auch möglich, dass Sie Boxed-Klassen anstelle von Primitiven übergeben (z. B. deserialize[java.lang.Integer]("1")), wenn Sie das Problem beheben können, aber dies erfordert zusätzlichen Code.

-1

Verwenden TypeTag statt Manifest. Manifest ist veraltet. Um die Typinformationen des generischen Parameters zu erhalten, können Sie im Code typeTag[T] verwenden. Ich habe die Implementierung von deserialize geändert, nur um zu demonstrieren, wie typeTag funktioniert und wie Sie auf die Informationen des generischen Typs zugreifen können.

def deserialize[T: TypeTag](value: T) = println(typeTag[T].tpe) 

Die obige Funktion gibt die Typinformationen aus. Sie können andere auf typeTag[T] definierte Methoden verwenden, um komplexere Logik zu erstellen.

Scala REPL

scala> def deserialize[T: TypeTag](value: T) = println(typeTag[T].tpe) 
deserialize: [T](value: T)(implicit evidence$1: reflect.runtime.universe.TypeTag[T])Unit 

scala> deserialize(List(1, 2, 3)) 
List[Int] 

scala> deserialize(1) 
Int 

scala> deserialize("hello") 
String 
Verwandte Themen