为什么选择具有哈希而不是点的Scala类型成员?

kei*_*ter 34 syntax type-systems scala

在Scala中,从类中选择类型的语法与从类中选择其他任何类型的语法不同.前者使用散列作为选择运算符而不是点.这是为什么?

示例:如果我们有这样的类......

class Example {
    type Foo = String
}
Run Code Online (Sandbox Code Playgroud)

为什么我们从这个类中选择类型......

val example:Example#Foo = "1"
Run Code Online (Sandbox Code Playgroud)

而不是像这样?

val example:Example.Foo = "1"
Run Code Online (Sandbox Code Playgroud)

Jea*_*let 43

Example#Foo被称为类型投影,将匹配任何类型Foo的任何类型的封闭实例Example.如果编写类型Example.Foo,编译器将查找调用的(而不是类型),ExampleFoo仅引用其封闭类型.这通常用于单例对象的上下文中.

例如:

object MyEnum extends Enumeration {
  val EnumValue = Value
}

val e: MyEnum.Value = MyEnum.EnumValue
Run Code Online (Sandbox Code Playgroud)

如果Scala用于.类型投影,这会导致混淆,因为前面的标识符可以解释为类型或值...因此#.请注意,正如@kassens所写,Java 在这方面只有类型预测.

  • 请注意,Java只有类型投影.Java的类型系统不能保证类返回同一实例*的内部类*的实例(相同的外部实例:`this.Inner`与任何外部实例:`Outer#Inner`). (11认同)