Scala关于seq重载的问题

想要写一个重载的方法:

insertBatch(sql: String, params: Seq[Seq[String]])
insertBatch(sql: String, params: Seq[Map[String,String]])

提示方法重复。
于是想用Any:

insertBatch(sql: String, params: Seq[Any])

函数的定义是可以定义,但是这个params的第二个维度要怎么使用?怎么样作为Map或者Seq来使用?总是提示“Type mismatch”。

阅读 3.1k
1 个回答

SF的答题能力不行呢。
同样的问题,在stackoverflow问,一个小时内就有答案了。
How can I overload functions with generic parameters in scala
出现这个报错的原因是由于JVM的“type erasure”(泛型擦除)机制导致的。
解决办法有两个:

  1. 可以使用 scala.reflect.runtime.universe.typeTag 来推断数据类型从而进行处理。具体实现可以参考Scala模式匹配泛型类型擦除问题,但是由于线程不安全的问题,这个方法很鸡肋,实际应用中基本无用。

  2. 由于本题目的特殊性(第二维是两种不同的类型),可以直接使用T代替被擦除的类型,在函数体内对直接判断即可。
    另外,采用1中参考链接文章的解决办法应该也可以尝试处理,本人并未做深刻尝试,不敢妄下定论。

贴一下最终实现代码:

  def insertBatch[T](sql: String, params: Seq[T]): Unit = {
    for(param <- params){
      var newSql = ""
      param match{
        case _: Map[String, String] =>
          val p = param.asInstanceOf[Map[String, String]]
          // do something like p.get("key")
        case _: Seq[String] =>
          val p = param.asInstanceOf[Seq[String]]
          // do something like p foreach{}
      }
    }
  }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进