gpt4 book ai didi

Scala 集合过滤器按类型

转载 作者:行者123 更新时间:2023-12-03 18:14:04 30 4
gpt4 key购买 nike

我是 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))

我得到了异常(exception):
java.lang.ClassCastException: CollectionsSpec$$anonfun$1$C$1 cannot be cast to CollectionsSpec$$anonfun$1$D$1

所以显然结果集仍然包含应该被过滤掉的元素。

我不明白为什么会发生这种情况,谁能解释一下?

编辑:
Scala:Scala 代码运行器版本 2.8.0.final

最佳答案

注意编译器警告,并添加 -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[_]]

有关类型删除的更详细说明,以及使用 Manifest 解决该问题的方法,请参阅:

https://stackoverflow.com/questions/tagged/type-erasure+scala

关于Scala 集合过滤器按类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3660217/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com