我需要知道泛型类型是否为字符串,以便对其执行不同的逻辑,例如:
def compute[A](field: String, record: GenericRecord): A match {
case String => record.get(field).asInstanceOf[Utf8].toString
case _ => record.get(field).asInstanceOf[A]
}
但是我不知道如何获取泛型的类型。
答案 0 :(得分:3)
如果不需要处理嵌套类型,可以使用ClassTag
进行匹配,如果需要,可以使用TypeTag
进行匹配:
import scala.reflect.{ClassTag, classTag}
def compute[A: ClassTag](field: String, record: GenericRecord): A = {
if (classTag[A] == classTag[String]) {
record.get(field).asInstanceOf[Utf8].toString.asInstanceOf[A]
} else {
record.get(field).asInstanceOf[A]
}
}
对于TypeTag
,请导入scala.reflect.runtime.universe.{TypeTag, typeTag}
,然后将ClassTag
更改为TypeTag
,将classTag
更改为typeTag
。
答案 1 :(得分:1)
也许是这样(可能可以优化):
import scala.reflect.ClassTag
def m[A](x: Any)(implicit tag: ClassTag[A]): A = {
tag.toString match {
case "java.lang.String" =>
(x.toString + " is a string").asInstanceOf[A]
case _ =>
x.asInstanceOf[A]
}
}
println(m[String]("123")) // 123 is a string
println(m[Int](456)) // 456