Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/vb6/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在列表中保留类型信息[任何]_Scala_Scala Collections - Fatal编程技术网

Scala 在列表中保留类型信息[任何]

Scala 在列表中保留类型信息[任何],scala,scala-collections,Scala,Scala Collections,我使用的某个外部库有一个方法,该方法使用不同的参数多次重载,例如: insertInto(index: Int, int: Int) insertInto(index: Int, lng: Long) insertInto(index: Int, dbl: Double) insertInto(index: Int, str: String) 我使用的某个case类的数据要传递到上述方法,比如: case class C(str: String, lng: Long, dbl: Double,

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

insertInto(index: Int, int: Int)
insertInto(index: Int, lng: Long)
insertInto(index: Int, dbl: Double)
insertInto(index: Int, str: String)
我使用的某个case类的数据要传递到上述方法,比如:

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...
但由于我总是在case类中使用值的索引,我想也许我可以通过以下方式节省一些代码行(大约10行):

c.productIterator.zipWithIndex.toList.foreach {
  case (idx, value) => insertInto(idx, value)
}
但这不起作用,因为我将迭代一个
列表[Any]
,因此编译器会抱怨我没有将正确的参数类型传递给
insertInto
,因为
Any
不是
字符串、Int、Long、Double等。

正确的处理方法是什么?提前谢谢

  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。检查


现在您有了类类型信息。您可以设计一些机制,将类类型值作为字符串映射到
.class
实例,然后使用
asinstanceof
来强制转换它。

为什么不定义
defstore(intput:C)={/*实现您的逻辑一次*/}
您只需执行一次,就不会每次都调用
insertInto
。感谢@marios的输入。那么多个
insertInto()
s不在
store()
方法中吗?我的目标是通过迭代case类值来压缩几个
insertInto()
s,您无法。。。只能在运行时再次检查列表[Any]的类型。然而,对于JVM类型的擦除,上述所有重载方法在运行时都变得无法区分。这些类型仅在编译时有效。因此,如果您使用productIterator删除类型,您就不能再调用重载方法。您可能可以使用宏或shapeless做一些更有趣的事情,但您真的需要走这条路吗?:)谢谢你的回答(顺便说一句,不是我投了反对票)。这很好,但是如果我尝试使用
instanceOf[T]
T
作为类型标记,编译器仍然会抱怨它不是
String、Int、Double等,而是
T
类型。一旦你有了T作为字符串的类型,你就可以用它来实例化和强制转换你的objectsInteresting,谢谢,我已经检查过了。除了使用几个
if
s并明确地执行许多
asInstanceOf[Int]
asInstanceOf[String]
等操作之外,我仍然看不出我该如何做