使用存在类型时出错

时间:2013-11-13 06:14:51

标签: scala

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

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 *)类GenericCompanion中的scala.collection.mutable.Set [A]存在,因此它可以应用于arguments()---因为---未确定的类型< / LI>
  • 类型不匹配; found:scala.collection.mutable.Set [A] required:scala.collection.mutable.Set [F =&gt;单位] forSome {type F&lt ;: Fruit}

为什么我会得到那些错误,据说我的set4相当于set3?我在某处犯了错误吗?

如果我说Set [(F forSome {F&lt ;: Fruit})=&gt;单位]然后那些行编译,但我无法向该集添加函数:

  • 类型不匹配;发现:Apple =&gt;所需单位:F forSome {type F&lt ;: Fruit} =&gt;单元

我可以在没有任何问题的情况下向set3添加相同的功能。

我遇到的另一个问题是我不能将存在类型放在作业的右侧:

// Does not compile, I get "unbound wildcard type"
val set1 = Set[_ >: Fruit]()

为什么?

1 个答案:

答案 0 :(得分: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() 

因为在您的定义中,forSomeSet相关,但需要与Function1相关

<强>更新

为什么不编译:

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

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