通用类型上的模式匹配

时间:2018-11-28 23:14:16

标签: scala

我需要知道泛型类型是否为字符串,以便对其执行不同的逻辑,例如:

def compute[A](field: String, record: GenericRecord): A match {
   case String => record.get(field).asInstanceOf[Utf8].toString
   case _ => record.get(field).asInstanceOf[A]
}

但是我不知道如何获取泛型的类型。

2 个答案:

答案 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