2016-11-28 7 views
1

ちょっと私はスカラーの中で可能な限り最善の方法でコードを書こうとしています、より良い方法があれば助けてください!スカラは引数としてクラス型を渡します

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

、使用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

Manifestの代わりにTypeTagを使用してください。マニフェストは推奨されていません。コード内で汎用パラメータの型情報を取得するには、typeTag[T]を使用できます。 deserializeの実装を変更して、typeTagの動作方法とジェネリック型情報へのアクセス方法を示しました。

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

上記の関数は、型情報を出力します。より複雑なロジックを実行するには、typeTag[T]に定義されている他のメソッドを使用できます。あなたがClass[T]を取得する必要がある場合

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 
関連する問題