我正在用存在类型做一些实验。首先,我定义了一个小类层次结构:
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()
最后一行给出了以下错误:
为什么我会得到那些错误,据说我的set4相当于set3?我在某处犯了错误吗?
如果我说Set [(F forSome {F&lt ;: Fruit})=&gt;单位]然后那些行编译,但我无法向该集添加函数:
我可以在没有任何问题的情况下向set3添加相同的功能。
我遇到的另一个问题是我不能将存在类型放在作业的右侧:
// Does not compile, I get "unbound wildcard type"
val set1 = Set[_ >: Fruit]()
为什么?
答案 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()
因为在您的定义中,forSome
与Set
相关,但需要与Function1
相关
<强>更新强>
为什么不编译:
val set1 = Set[_ >: Fruit]()
原因很简单。从=
左侧定义类型和变量名称,右侧是调用类型构造函数和类构造函数。并且您尝试使用未定义的值调用类型构造函数,但需要构造最终类型,这是错误的原因。