最初の呼び出しでjava.util.Map[String,Java.util.Map]
がある場合、オーバーロードされた正しいメソッドはtoScala(java.util.Map[_,_])
となります。しかし、mapValues呼び出しでは、関数toScala(other:Any)
が呼び出されます。これを避ける方法は? Map、List、Int、Stringのようなjavaオブジェクトを使ってtoScalaを呼び出すことになります。マップには値の1つとして別のjava.util.Map/java.util.List/ String/Int
が含まれている場合があります。スカラオーバーロードの問題
private def toScala(v: Any): Any = vmatch {
case null => throw new NullPointerException("null value encountered while converting Java to Scala")
case m: java.util.Map[_, _] => m.asScala.mapValues(toScala).toMap
case m: java.util.List[_] => m.asScala.map(toScala).toMap
case m: java.util.Set[_] => m.asScala.map(toScala).toMap
case m => m
}
または::そのメンバーが
private def toScala(map:java.util.Map[_,_]) : Any = {
map match {
case null => Map.empty
case _ => map.asScala.mapValues(toScala).toMap
}
}
private def toScala(list:java.util.List[_]) : Any = {
list match {
case null => List.empty
case _ => list.asScala.map(toScala).toList
}
}
private def toScala(other:Any) : Any = {
other match {
case null => None
case _ => other
}
}
ために適切なタイプの代わりに、ワイルドカードをと'Any'。私はあなたが何をしたいのかは分かりませんが、typeclassesが解決策かもしれません。 –
しかし、MapにはList、String、Int、Mapなどの型の値が含まれているので、これを行うことはできません。JavaAppConfigWrapperを介してScalaAppconfigWrapperを構築しようとしています – bugs
コードをどのように編集してコードを呼び出してください。あなたがはっきりと解決することを期待するもの。 –