在List [Any]中保留类型信息

时间:2017-02-01 03:04:24

标签: scala scala-collections

我使用的某个外部库有一个方法,该方法使用不同的参数多次重载,如:

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..

处理此问题的正确方法是什么?提前致谢

1 个答案:

答案 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来强制转换它。