2016-11-28 244 views
1

嘿,我試圖在scala中以最好的方式編寫下面的代碼,如果有更好的方法,請幫助我!Scala傳遞類類型作爲參數

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; 
} 

低於一個好的?

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

'Manifest'已棄用。使用'TypeTag' – Falmarri

回答

3

如果您需要獲得Class[T],使用scala.reflect.ClassTag(不TypeTag,你可以從它那裏得到的Class,但只在一個迂迴的方式):

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

小心在調用時不要忘記類型參數(即deserialize[String]("\"a\""),而不是deserialize("\"a\"")),否則Scala會將其推斷爲Nothing

也有可能你需要通過盒裝類而不是基元(例如deserialize[java.lang.Integer]("1")),如果是的話你可以解決這個問題,但這將需要額外的代碼。

-1

使用TypeTag而不是Manifest。清單已棄用。在代碼中,爲了獲得通用參數的類型信息,您可以使用typeTag[T]。我改變了反序列化的實現爲了演示typeTag如何工作以及如何訪問泛型類型信息。

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

上述功能打印類型信息。您可以使用typeTag[T]上定義的其他方法來執行更復雜的邏輯。

斯卡拉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