相关疑难解决方法(0)

过滤器的Scala集合类型

假设你有一个List(1,"1")它是类型List [Any],这当然是正确的和预期的.现在,如果我像这样映射列表

scala> List(1, "1") map {
     |   case x: Int => x
     |   case y: String => y.toInt
     | }
Run Code Online (Sandbox Code Playgroud)

结果类型是List [Int],也是预期的.我的问题是,是否存在等效于过滤器的映射,因为以下示例将导致List [Any].这可能吗?我假设这可以在编译时解决,可能不是运行时?

scala> List(1, "1") filter {
     |   case x: Int => true
     |   case _ => false
     | }
Run Code Online (Sandbox Code Playgroud)

types scala scala-2.8 scala-collections

20
推荐指数
2
解决办法
3618
查看次数

使用带有收集的类型

我正在尝试根据类型动态过滤(或收集)列表:

如果我这样做明确指定类型,它工作正常

scala> var aList = List("one", 2, 3.3)
aList: List[Any] = List(one, 2, 3.3)

scala> aList.collect{case x:Int => x}
res10: List[Int] = List(2)
Run Code Online (Sandbox Code Playgroud)

如果我想编写一个方法来执行此操作,那么它不会:

scala> def collectType[T](l:List[Any]):List[T] = l.collect{case x:T => x}
warning: there were unchecked warnings; re-run with -unchecked for details
collectType: [T](l: List[Any])List[T]

scala> collectType[Int](aList)
res11: List[Int] = List(one, 2, 3.3)

scala> collectType[Double](aList)  
res16: List[Double] = List(one, 2, 3.3)

scala> collectType[String](aList)
res14: List[String] = List(one, 2, 3.3)
Run Code Online (Sandbox Code Playgroud)

我一开始以为它是在命名"Integer"类型而不是使用Integer作为类型,但似乎并非如此:

collectType[Int](aList).foreach(x => println(x))
java.lang.ClassCastException: java.lang.String cannot be cast to …
Run Code Online (Sandbox Code Playgroud)

types scala type-erasure

3
推荐指数
1
解决办法
157
查看次数