Scala是否具有投影嵌套单例类型的语法?

Ale*_*nov 7 scala

class C {
  object O
}

val x: C#O.type = (new C).O // error: ';' expected but '.' found
val y: C#(O.type) = (new C).O // error: identifier expected but '(' found
Run Code Online (Sandbox Code Playgroud)

这种类型有合法的语法吗?

编辑:

val x: c.O.type forSome { val c: C } = (new C).O
Run Code Online (Sandbox Code Playgroud)

ScalaFiddle.scala:4: error: type mismatch;
 found   : ScalaFiddle.this.C#O.type
 required: c.type#O.type forSome { type c.type <: ScalaFiddle.this.C with scala.this.Singleton{} }
  val x: c.O.type forSome { val c: C } = (new C).O
                                                 ^
Run Code Online (Sandbox Code Playgroud)

所以Scala编译器理解这种类型并将其显示为C#O.type.在创建语法时,似乎忽略了这种情况.

Dat*_*yen 1

该对象O仅与 的实例一起存在C,因此其类型也需要与 的实例绑定C。因此你不能执行C#O.typeor C#(O.type),但你需要有一个Cfirst 的实例,例如:

scala> class C { object O }
defined class C

scala> val x = new C
x: C = C@59f95c5d

scala> val y: x.O.type = x.O
y: x.O.type = C$O$@5679c6c6
Run Code Online (Sandbox Code Playgroud)

编辑:阿列克谢·罗曼诺夫在下面评论说我的结论是不正确的,这可以通过下面的例子来证明:

scala> class B { class A {} }
defined class B

scala> val t = new B
t: B = B@63d4e2ba

scala> val u: B#A = new t.A
u: B#A = B$A@1cd072a9
Run Code Online (Sandbox Code Playgroud)

所以我实际上不知道为什么B#A有效但C#O.type不起作用:(

  • 对于“O 类”,第一句话的逻辑不会改变:“类“O”的每个实例仅与“C”实例一起存在,因此其类型需要与“C”实例绑定以及”。通常是:`cO`。但“因此你不能做‘C#O’”的结论当然是不正确的。 (3认同)