【问题标题】:Why does one select Scala type members with a hash instead of a dot?为什么选择 Scala 类型的成员使用散列而不是点?
【发布时间】:2011-07-13 08:22:39
【问题描述】:

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

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

class Example {
    type Foo = String
}

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

val example:Example#Foo = "1"

而不是这样?

val example:Example.Foo = "1"

【问题讨论】:

    标签: scala syntax type-systems


    【解决方案1】:

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

    例如:

    object MyEnum extends Enumeration {
      val EnumValue = Value
    }
    
    val e: MyEnum.Value = MyEnum.EnumValue
    

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

    【讨论】:

    • 请注意,Java 只有类型投影。 Java的类型系统不能保证一个类返回一个同一个实例的内部类的实例(同一个外部实例:this.Inner vs.任何外部实例:Outer#Inner)。跨度>
    猜你喜欢
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多