gpt4 book ai didi

scala - 如何在 scala 中使用泛型参数重载函数

转载 作者:行者123 更新时间:2023-12-03 03:00:05 25 4
gpt4 key购买 nike

我只想在函数中重载 seq,例如:

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

但总是提示我“insertBatch(String, Seq) 已在范围内定义”。所以我尝试使用“Any”:

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

这个可以定义,但是如何在函数中使用这个参数?如:

def insertBatch(sql: String, params: Seq[Any]){
......
for( param <- params) {
// when param is a map?
for( p <- param) {
...
}
// when param is a seq?
param.get("some Key")
...
}
......
}

Scala 对我来说只是一门新语言,有什么帮助吗?

最佳答案

由于 JVM 的类型删除,上述两种方法在运行时 JVM 无法区分。处理类型删除问题的一般方法是TypeTag。您也可以使用 classTag,但 classTag 是有限的。

因此,不要声明两个方法,而是使用类型参数 T 声明一个方法,并在运行时找出 T 是什么并继续。

  import scala.reflect.runtime.universe._

def insertBatch[T: TypeTag](sql: String, params: Seq[T]): Unit = typeOf[T] match {
case a if a =:= typeOf[Seq[String]] =>
val l = params.asInstanceOf[Seq[Seq[String]]]
// do something here
case b if b =:= typeOf[Map[String, String]] =>
val l = params.asInstanceOf[Seq[Map[String, String]]]
// do something here
case _ => //some other types
}

Scala REPL

scala> :paste
// Entering paste mode (ctrl-D to finish)

import scala.reflect.runtime.universe._

def insertBatch[T: TypeTag](sql: String, params: Seq[T]): Unit = typeOf[T] match {
case a if a =:= typeOf[Seq[String]] =>
val l = params.asInstanceOf[Seq[Seq[String]]]
println("bar")
case b if b =:= typeOf[Map[String, String]] =>
val l = params.asInstanceOf[Seq[Map[String, String]]]
println("foo")
case _ => println("ignore")
}



// Exiting paste mode, now interpreting.

import scala.reflect.runtime.universe._
insertBatch: [T](sql: String, params: Seq[T])(implicit evidence$1: reflect.runtime.universe.TypeTag[T])Unit

scala> insertBatch[Seq[String]]("", Seq(Seq("")))
bar

scala> insertBatch[Map[String, String]]("", Seq(Map.empty[String, String]))
foo

scala> insertBatch[String]("", Seq(""))
ignore

关于scala - 如何在 scala 中使用泛型参数重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40357616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com