1

我正在用存在类型做一些实验。首先我定义了一个小的类层次结构:

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]()

这是为什么?

4

1 回答 1

1

代码中的一些错误:

val set4: Set[F => Unit] forSome { type F <: Fruit } = Set()

需要定义为:

val set4: Set[(F => Unit) forSome { type F <: Fruit }] = Set()
//OR:    
val set4: Set[Function1[F,Unit] forSome { type F <: Fruit }] = Set() 

因为在你的定义forSome中是相关Set但需要相关Function1

更新:

为什么不编译:

val set1 = Set[_ >: Fruit]()

原因很简单。左边=是定义类型和变量名,右边是调用类型构造函数和类构造函数。并且您尝试使用未定义的值调用类型构造函数,但需要构造最终类型,这是错误的原因。

于 2013-11-13T07:28:23.913 回答