是否可以做这样的事情:
val xs = List("a", "1", "5.3")
(xs zip List(String, Int, Double)).map{
case (e, t) => e.asInstanceOf[t]
}
如您所见,我正在尝试将字符串列表解析为正确的类型。
当然上面的内容不起作用,特别是对于“String”部分。编译器抱怨error: object java.lang.String is not a value
。
修改 我知道这不是以上述方式可行的。你能提出一个很好的方法来实现这个目标吗?
答案 0 :(得分:1)
您想要的是将转化器列表String => String
,String => Int
,String => Double
应用于您的字符串列表。
这可以通过将实际转换器(而不是类型)传递到列表来完成:
xs.zip(List(x => x, x => x.toInt, x => x.toDouble)).map {
case (str, conv) => conv(str)
}
但是,由于列表中的元素必须具有相同的类型,因此这将为您提供List[Any]
,并且您将失去所有强类型的优势。
我认为最简单的解决方案是不要尝试按照List
进行转换,而是按照您的业务逻辑进行转换:
val s: String = xs(0)
val i: Int = xs(1).toInt
val d: Double = xs(2).toDouble
如果您坚持使用List
- 就像转换一样,您可以尝试无形HList
和Poly
,但这需要对类型理论有一个强有力的基本理解,所以我' d而不是在这个答案中钻研它。
答案 1 :(得分:1)
你实际上可以写一个合法的等同于
(xs zip List(String, Int, Double)).map{
case (e, t) => e.asInstanceOf[t]
}
它的
(xs zip List(classOf[String], classOf[Int], classOf[Double])).map{
case (e, t) => t.cast(e)
}
但当然它会引发异常,就像你的原始代码一样,因为例如"1"
不是Int
,而是String
。