通过反射查找 Scala 案例类声明字段上的 List 类型

问题描述 投票:0回答:1

我有一个 Scala 案例类,其

List
声明为:

  AuxiliaryImages: List[MimeInfo],

我使用反射获取字段类型:

  private def ft(fieldName: String): Class[_] = {
    val field = classOf[CatalogItemRecord].getDeclaredField(fieldName)
    field.getType
  }

我需要基于

List
类型的条件逻辑:

  if (ft("AuxiliaryImages") == classOf[List[MimeInfo]]) {

但似乎我失去了列表类型

List[MimeInfo]]
,因为我得到了
scala.collection.immutable.List
字段类型。

有没有办法通过声明字段的反射来获取列表类型

List[MimeInfo]]

scala reflection
1个回答
0
投票

您应该使用

Field#getGenericType
而不是
Field#getType
。尝试一下

def ft(fieldName: String): (Class[_], Seq[Class[_]]) = {
  val field = classOf[CatalogItemRecord].getDeclaredField(fieldName)
  field.getGenericType match {
    case pt: ParameterizedType =>
      val cls = pt.getRawType match {
        case c: Class[_] => c
      }
      val argClasses = pt.getActualTypeArguments.map {
        case c: Class[_] => c
      }.toSeq
      (cls, argClasses)
  }
}
ft("AuxiliaryImages") == (classOf[List[_]], Seq(classOf[MimeInfo])) // true i.e. List[MimeInfo]
ft("AuxiliaryImages") == (classOf[List[_]], Seq(classOf[Int])) // false i.e. not List[Int]
© www.soinside.com 2019 - 2024. All rights reserved.