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的新手,遇到了以下问题:
我想获得一个仅包含特定类型元素的现有集合的子集合.以下作品:
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)