我使用的某个外部库有一个方法,该方法使用不同的参数多次重载,如:
insertInto(index: Int, int: Int)
insertInto(index: Int, lng: Long)
insertInto(index: Int, dbl: Double)
insertInto(index: Int, str: String)
某个案例类我使用我希望传递给所述方法的数据,比如说:
case class C(str: String, lng: Long, dbl: Double, int: Int /* more values */)
val c = C("asd", 1, 1.1, 1)
现在我使用的库方法如下:
insertInto(1, c.int)
insertInto(2, c.lng)
insertInto(3, c.dbl)
insertInto(4, c.str)
//more insertions...
但是因为我总是在案例类中使用值的索引,所以我认为也许我可以节省一些代码行(大约10),如下所示:
c.productIterator.zipWithIndex.toList.foreach {
case (idx, value) => insertInto(idx, value)
}
但是这不起作用因为我正在迭代List[Any]
,因此编译器抱怨我没有将正确的参数类型传递给insertInto
,因为Any
不是String, Int, Long, Double, etc..
处理此问题的正确方法是什么?提前致谢
答案 0 :(得分:-1)
case class A[T](t:T)(implicit tag: ClassManifest[T]){
val newTag = tag
override def toString= t+" "+tag.toString
}
case class C(xs:List[Any])
val c=C(List(A("a"),A[Long](1), A[Double](1.1), A[Int](1)))
c.xs.foreach(println)
试试这个。我正在使用Scala 2.9.3。在较新的版本中,您可以使用TypeTag和ClassTag。查看here
所以现在你有类类型信息。您可以设计一些机制将类类型值作为字符串映射到.class
实例,然后使用asinstanceof
来强制转换它。