【发布时间】:2014-05-02 09:01:06
【问题描述】:
根据对this question 的回答,似乎将“forSome”放在类型定义的一个组件之后与将它放在整个事物的末尾是不同的。例如,以下内容似乎有所不同:
def one: Foo[U >: T] forSome {type U >: T}
def one: Foo[U forSome {type U >: T}]
Scala 语言规范似乎没有说明任何区别,我原以为将量词移到外部不会有任何区别。如果它确实有所作为,我会认为它会如this answer 中所述,它基本上说 Set[X forSome {type X}] 允许 X 在集合元素之间变化,其中 Set[X] forSome {type X } 才不是。然而,这似乎不是全部和/或不正确,因为这不能编译:
trait Bar {
def test: Set[X] forSome {type X}
}
def test(b: Bar) {
val set = b.test
val h = set.head
set.contains(h)
}
但这确实:
trait Bar {
def test: Set[X forSome {type X}]
}
def test(b: Bar) {
val set = b.test
val h = set.head
set.contains(h)
}
似乎 Set[X] forSome {type X} 为实例化类中的每个使用站点创建一个单独的抽象类型,其中 Set[X forSome {type X}] 仅创建一个并将其用于整个类.这与我的预期相反,并且似乎与上面的答案参考不一致。
【问题讨论】:
-
@Andrey - 这很有趣,特别是因为该问题的公认答案暗示语义与我所看到的相反。
-
@Andrey - 实际上我会更进一步,并说该问题的公认答案作为这个问题的答案没有用,并且可能完全错误。请参阅上面我修改后的示例。
-
this page 上的倒数第二个代码块解释了差异。我认为您的第一个是 All Sets,第二个是 A Set for all Whats。