我一直在寻找实现这一点,即使使用 Manifest 和 Reflect API,仍然很难实现。
使用 Manifest 和 Reflection,我可以将 List[Any] 匹配到一个类(List[A]),我还可以通过类型 T 进行匹配,就像在 http://daily-scala.blogspot.co.uk/ 2010/01/overcoming-type-erasure-in-matching-1.html
如何保存 TypeTag 然后稍后使用它将类型重新附加到 Any (Scala 2.10)
但是我怎样才能确定输入的类型并在方法中使用它呢?
说,
object test {
val list : List[List[Any]] = List(
List(2.5, 3.6 ,7.9),
List("EUR","HKD", "USD")
)
def calculateString(in:List[String]) = {
println("It's a String List")
println(in)
}
def calculateDouble(in:List[String]) = {
println("It's a Double List")
println(in)
}
def main( args: Array[String]){
list.foreach(l=> matchAndCalculate(l))
}
// Copy from Andrzej Jozwik it doesn't work, but it's good to demonstrate the idea
def matchAndCalculate(list:List[Any]) = list match {
case i if i.headOption.exists(_.isInstanceOf[Long]) => calculateLong(i)
case i if i.headOption.exists(_.isInstanceOf[String]) => calculateString(i)
}
}
非常感谢
哈维
PS:正如莎拉指出的那样,在我将它们放入更复杂的结构之前,这可能是在我首先创建列表时保持类型清单的唯一方法。
这是挑战:是否可以将 List[Any] 转换回/匹配到 List[String] 并作为 def dummyMethod(stringList: List[String]) 等方法的输入而不会惹恼编译器?