У меня есть метод, который должен динамически преобразовывать член поля в определенный тип в зависимости от флага конфигурации format
.
Этот флаг format
принимает одно из следующих значений типа:
object Types {
val Str = "string"
val IntNum1 = "int"
val IntNum2 = "integer"
val DoubleNum = "double"
val LongNum = "long"
}
Один из вариантов - использовать отражение. Другой вариант - использовать сопоставление с образцом (метод, с которым я пытаюсь это сделать)
Вот метод для String
типов:
private def getValClassIfStr(format: String): Class[String] = {
format.toLowerCase match {
case Types.Str => classOf[String]
case _ => null
}
}
А вот метод для числового типы, начиная с AnyVal
, которые не компилируются:
private def getValueClass[T <: AnyVal](format: String): Try[Class[T]] = {
format.toLowerCase match {
case Types.IntNum1 || Types.IntNum2 => Success(classOf[Int])
case Types.DoubleNum => Success(classOf[Double])
case Types.LongNum => Success(classOf[Long])
case _ => Failure(new Exception)
}
}
Второй метод не компилируется из-за: Type mismatch: required Try[Class[T]] found Try[Class[Int]]
Что я не понимаю, учитывая T <: AnyVal
.
Есть идеи? и если это плохой подход, какой будет «чистая» альтернатива?