我有一个 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]]
?
您应该使用
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]