【发布时间】:2020-01-05 17:13:30
【问题描述】:
我有一个方法应该根据配置标志 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。
有什么想法吗?如果这是一种不好的方法,那么“干净”的替代方案会是什么?
【问题讨论】:
-
我只会创建自己的 ADT 类型和自己的解析器。
-
@Mehdi B. : 如果有人打电话给
getValueClass[Double]("int")会发生什么?Type mismatch错误是因为这个。编译器不相信实际的返回类型会符合声明的返回类型。 -
@asanand 谢谢,这是有道理的。