【问题标题】:Scala Overloading IssueScala重载问题
【发布时间】:2026-01-20 20:30:01
【问题描述】:

如果我有一个java.util.Map[String,Java.util.Map] 用于第一次调用,则会调用正确的重载方法:toScala(java.util.Map[_,_])。但是在 mapValues 调用中,函数 toScala(other:Any) 被调用。如何避免这种情况? 我将使用 Map、List、Int、String 等 Java 对象调用 toScala。该映射可能包含另一个 java.util.Map/java.util.List/ String/Int 作为其值之一。同样,该列表还可能包含另一个 java.util.List/ String/ Int 作为其成员

  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。我不确定您到底想做什么,但类型类可能是解决方案。
  • 但我不能这样做,因为我的 Map 可能包含 List、String、Int、Map 等类型的值。我正在尝试在 JavaAppConfigWrapper 上构建一个 ScalaAppconfigWrapper
  • 请编辑您的问题,向我们展示您是如何调用代码的。您希望清楚地解决什么问题。

标签: scala scala-collections


【解决方案1】:

也许这对你有帮助:

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

干杯

【讨论】:

  • 我现在正在做这样的事情琼,但我想使用重载是否可能。
  • 不可能:重载在编译时根据参数的静态类型完全解决,因此如果映射值的类型为Any,则必须区分可能的值类型运行时(正如琼在这里所做的那样)。