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.在创建语法时,似乎忽略了这种情况.
该对象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不起作用:(