相关疑难解决方法(0)

如何在Scala上绕过类型擦除?或者,为什么我不能获得我的集合的类型参数?

Scala生活中的一个可悲事实是,如果你实例化一个List [Int],你可以验证你的实例是一个List,你可以验证它的任何单个元素是一个Int,但不是它是一个List [ Int],可以很容易地验证:

scala> List(1,2,3) match {
     | case l : List[String] => println("A list of strings?!")
     | case _ => println("Ok")
     | }
warning: there were unchecked warnings; re-run with -unchecked for details
A list of strings?!
Run Code Online (Sandbox Code Playgroud)

-unchecked选项将责任直接归咎于类型擦除:

scala>  List(1,2,3) match {
     |  case l : List[String] => println("A list of strings?!")
     |  case _ => println("Ok")
     |  }
<console>:6: warning: non variable type-argument String in type pattern is unchecked since it is eliminated by erasure
        case l …
Run Code Online (Sandbox Code Playgroud)

scala type-erasure

366
推荐指数
7
解决办法
7万
查看次数

Scala集合按类型过滤

我是scala的新手,遇到了以下问题:

我想获得一个仅包含特定类型元素的现有集合的子集合.以下作品:

class C(val name : String)
class D(name : String) extends C(name) { }

val collection = Set[C](new C("C1"),new D("D1"),new C("C2"),new D("D2"))
collection.collect{case d : D => d}.size must be === 2 // works
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用方法"onlyInstancesOf [Type]"扩展集合类时,这不起作用.首先是我的实施:

object Collection {
    implicit def extendScalaCollection[E](coll : Traversable[E]) = new CollectionExtension[E](coll)
}

class CollectionExtension[E](coll : Traversable[E]) {

    def onlyInstancesOf[SpecialE <: E] : Traversable[SpecialE] = {
        coll.collect({case special : SpecialE => special}).asInstanceOf[Traversable[SpecialE]]
    }
}
Run Code Online (Sandbox Code Playgroud)

所以当我使用这个扩展并执行时:

collection.onlyInstancesOf[D].size must be === 2
Run Code Online (Sandbox Code Playgroud)

我得到一个错误,.size返回4而不是2.此外,我检查,结果实际上包含C1和C2虽然它不应该.

当我做:

collection.onlyInstancesOf[D].foreach(e => …
Run Code Online (Sandbox Code Playgroud)

types scala filter type-erasure scala-collections

4
推荐指数
2
解决办法
2918
查看次数

标签 统计

scala ×2

type-erasure ×2

filter ×1

scala-collections ×1

types ×1