2016-03-23 4 views
0

最初の呼び出しで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 
    } 
    } 
+0

ために適切なタイプの代わりに、ワイルドカードをと'Any'。私はあなたが何をしたいのかは分かりませんが、typeclassesが解決策かもしれません。 –

+0

しかし、MapにはList、String、Int、Mapなどの型の値が含まれているので、これを行うことはできません。JavaAppConfigWrapperを介してScalaAppconfigWrapperを構築しようとしています – bugs

+0

コードをどのように編集してコードを呼び出してください。あなたがはっきりと解決することを期待するもの。 –

答えて

0

多分これはあなたが助けと同様に、リストには、別のjava.util.List/ String/ Intが含まれていてもよい

private def toScalaOption(v: Any): Any = vmatch { 
  case null => None 
  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 => Some(m) 
} 

乾杯

+0

私は今のような何かをやっていますが、ジョーンですが、オーバーロードを使いたいと思っています。 – bugs

+1

不可能:引数の静的型に基づいてコンパイル時にオーバーロードが完全に解決されるため、マップ値の型がAnyの場合、実行時に可能な値の型を区別する必要があります(Joanはここで)。 –

関連する問題