Scala集合按类型过滤
发布时间:2020-12-16 18:26:58 所属栏目:安全 来源:网络整理
导读:我是 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"))colle
我是
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 但是当我尝试使用方法“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]] } } 所以当我使用这个扩展并执行时: collection.onlyInstancesOf[D].size must be === 2 我得到一个错误,.size返回4而不是2.此外,我检查,结果实际上包含C1和C2虽然它不应该. 当我做: collection.onlyInstancesOf[D].foreach(e => println(e.name)) 我得到了例外: java.lang.ClassCastException: CollectionsSpec$$anonfun$1$C$1 cannot be cast to CollectionsSpec$$anonfun$1$D$1 显然,结果集仍然包含应该过滤掉的元素. 我不知道为什么会发生这种情况,任何人都能解释一下吗? 编辑: 解决方法
注意编译器警告,并添加-unchecked scala命令行选项.
M:&;scala -unchecked Welcome to Scala version 2.8.0.final (Java HotSpot(TM) Client VM,Java 1.6.0_21) . Type in expressions to have them evaluated. Type :help for more information. scala> class CollectionExtension[E](coll : Traversable[E]) { | | def onlyInstancesOf[SpecialE <: E] : Traversable[SpecialE] = { | coll.collect({case special : SpecialE => special}).asInstanceOf[Traversable[SpecialE]] | } | } <console>:8: warning: abstract type SpecialE in type pattern SpecialE is unchecked since it is eliminated by erasure coll.collect({case special : SpecialE => special}).asInstanceOf[Traversable[SpecialE]] ^ defined class CollectionExtension 警告意味着编译器可以做的最好的事情相当于: coll.collect({case special : AnyRef => special}).asInstanceOf[Traversable[_]] 有关类型擦除的更详细说明以及使用清单解决方法,请参阅: https://stackoverflow.com/questions/tagged/type-erasure+scala (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 不要再把vim当做Python文本编辑器了!用这个!
- 如何在shell中获取pythonpath?
- angular – Ngxs – 如何使用selectSnapshot?
- angular2中使用html2canvas将数据导出为图片,并下载本地
- webservice+annotation---ONE
- typescript – 使用带有ngFor和Async Pipe Angular 2的Obse
- webservice的应用--java+maven项目
- angular 2 – 具有injectToken依赖关系的模拟组件
- bash – 忽略变量内的引号
- AngularJs+BootStarp+fontAwesome打造个人展示页面