我正在用存在类型做一些实验。首先我定义了一个小的类层次结构:
trait Fruit
case class Apple extends Fruit
case class Banana extends Fruit
然后我想要一个可以添加不同类型水果的集合:
val set1: Set[_ >: Fruit] = Set()
// Which is equivalent to:
val set2: Set[F] forSome { type F >: Fruit } = Set()
// This compiles
set1 += Apple()
set1 += Banana()
set2 += Apple()
set2 += Banana()
到目前为止,一切都很好。但现在我想要从一些 Fruit 到 Unit 的一组函数:
// This still compiles
val set3: Set[(_ <: Fruit) => Unit] = Set()
// But this doesn't
val set4: Set[F => Unit] forSome { type F <: Fruit } = Set()
最后一行给了我以下错误:
- 方法应用没有类型参数: (elems: A*)scala.collection.mutable.Set[A] 在类 GenericCompanion 中存在,因此它可以应用于 arguments () --- 因为 --- 未确定类型
- 类型不匹配; 找到:scala.collection.mutable.Set[A] 需要:scala.collection.mutable.Set[F => Unit] forSome { type F <: Fruit }
当我的 set4 与 set3 等价时,为什么会出现这些错误?我在某个地方犯了错误吗?
如果我说 Set[(F forSome { F <: Fruit }) => Unit] 则该行编译,但我无法向该集合添加函数:
- 类型不匹配; 发现:Apple => 所需单位:F forSome { type F <: Fruit } => Unit
我可以毫无问题地向 set3 添加相同的功能。
我遇到的另一个问题是我不能将存在类型放在赋值的右侧:
// Does not compile, I get "unbound wildcard type"
val set1 = Set[_ >: Fruit]()
这是为什么?