它与类型名称中提到的内部类一起很有用。例如,请参阅中定义的 Graph 和 Node 类Scala 之旅:内部类 http://www.scala-lang.org/node/115。对值的存在量化用于写入某些未指定图的节点类型。
type SomeNode = g.Node forSome { val g: Graph }
如果您想要一个方法将两个节点作为必须来自同一个图的参数,这可能很有用。
def somethingWithTwoNodes[N <: g.Node forSome { val g: Graph }](n1: N, n2: N) = (n1,n2)
请注意,2.7 不会接受该方法定义,因为它认为 N 中存在某种递归。
那么如果你有
val g1 = new Graph
val g2 = new Graph
然后这些编译
somethingWithTwoNodes(g1.newNode, g1.newNode)
somethingWithTwoNodes(g2.newNode, g2.newNode)
但这些不
somethingWithTwoNodes(g1.newNode, g2.newNode)
somethingWithTwoNodes(g2.newNode, g1.newNode)
至于 Singleton 特征,它并没有以典型的方式真正定义,即没有它的类文件。它类似于 Any、AnyVal、AnyRef 和 Null 类型。它定义在src/compiler/scala/tools/nsc/symtab/Definitions.scala
以及这些其他类型,但我怀疑这是非常有用的信息。作为最终特征,这也是一个奇怪的野兽,这意味着您在定义特征或类时不能将其混合在一起,它实际上更像是编译器归因于类型的标记,表明它与任何其他类型都是唯一的。