2016-03-23 2 views
0

Если у меня есть java.util.Map[String,Java.util.Map] для первого вызова, правильный перегруженный метод называется: toScala(java.util.Map[_,_]). Но в вызове mapValues ​​вызывается функция toScala(other:Any). Как этого избежать? Я бы назвал toScala с помощью java-объекта, такого как Map, List, Int, String. Карта может содержать другое значение java.util.Map/java.util.List/ String/Int как одно из его значений. Точно так же список может также содержать другой java.util.List/ String/ Int как своих членовScala Overloading Issue

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'. Я не уверен, что именно вы хотите сделать, но может быть решением для моделей. –

+0

Но я не могу этого сделать, поскольку моя карта может содержать значения типов List, String, Int, Map и т. Д. Я пытаюсь создать ScalaAppconfigWrapper над JavaAppConfigWrapper – bugs

+0

Пожалуйста, отредактируйте свой вопрос, чтобы показать нам, как вы вызываете код. То, что вы ожидаете, решит. –

ответ

0

Может быть, это поможет вам:

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 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', вам придется различать возможные типы значений во время выполнения (как это делает Джоан). –

 Смежные вопросы

  • Нет связанных вопросов^_^