У меня есть класс случая 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 имеет мощную систему типов, позволяющую избежать использования отражения. Мне интересно, рассматривали ли вы уже другие методы, такие как ADT , классы типов , функции высшего порядка и т. д.
Какую метапроблему вы пытаетесь решить?
@GastónSchabas Стирание типа не имеет значения. Если у вас есть экземпляр типа Foo[Bar]
, то среда выполнения Java действительно воспринимает его как Foo[_]
. Но если у вас есть класс с полем типа Foo[Bar]
, то среда выполнения Java знает, что это именно Foo[Bar]
.
Вместо 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]
Это происходит из-за стирания типа во время выполнения . В зависимости от того, какую версию Scala вы используете, подход к решению вашей проблемы будет разным. Дополнительную информацию можно найти в разделе Сохранение информации о типе во время выполнения в Scala 2. Я не так много изучал Scala 3, чтобы знать, как это делать правильно.