gpt4 book ai didi

generics - 从泛型集合中选择类型的子集

转载 作者:行者123 更新时间:2023-12-04 06:17:17 25 4
gpt4 key购买 nike

好的,伙计们,我现在开始了解一些 Scala 了,但时不时会遇到一些更棘手的概念。让我向您介绍水果世界:

class Fruit
class Pear extends Fruit
class Apple extends Fruit
class GrannySmith extends Apple

现在,如果我想要一个新的泛型集合,它允许我从泛型集合中挑选 Fruits 的子集,该怎么办。幼稚的实现:
class MyArray[T](var a:Array[T]) {
def select[U <: T] =
a.filter(_ match {
case u:U => true
case _ => false
})
}

然而这不起作用。
scala> var ma = new MyArray(
Array(
new Apple,
new Fruit,
new Pear,
new GrannySmith,
new Apple,
new Fruit
))


scala> ma.select[Apple]
res1: Array[Fruit] = Array(Apple@4d815146, Fruit@64fef26a, Pear@1ddd40f3, GrannySmith@28d320d6, Apple@3d10d68a, Fruit@1c751d58)

控制台警告未检查的错误,在定义 MyArray 时使用 -unchecked 重新运行给出了这个:
<console>:8: warning: abstract type U in type pattern U is unchecked since it is eliminated by erasure
case u:U => true

所以我对类型删除的理解非常模糊。我知道它在某种程度上与 jvm 中有限的动态类型有关,并且您有时可以使用 Manifests 来解决它,因为 Daniel 正在谈论 here .我特别不明白的是在这个例子中这是如何工作的,以及如何解决它。

我很感激任何帮助!

最佳答案

这个怎么样?您甚至可以获得正确的返回类型。

ma.a.collect { case a: Apple => a }

关于generics - 从泛型集合中选择类型的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7067332/

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