Scala:伴生对象与样例类的定义顺序

20
在Scala 2.9.1中,我遇到了以下行为:
class Foo {
   case class X()
   object X            // this compiles

   def bar() {
      object Y         // this compiles
      case class Y()

      case class Z()
      object Z         // won't compile (see below)
   }
}

编译器抱怨Object Z: 错误:Z已经定义为(编译器生成的)case类伴生对象Z。
如果在函数定义内部定义case类后再定义case类的伴生对象,似乎是不允许的。这是编译器的bug还是有意为之?如果是后者,为什么要这样做呢?
2个回答

14

它很容易解决,所以我不确定是否值得投票支持。感谢提供票证的链接。 - Gregor Scheidt

1
第一个被允许而第二个不被允许的原因是类和对象可以有前向定义,但定义不能。所以为什么编译器可以将object X与由case类定义的那个混合在一起,而在第二种情况下则不可能。
我想知道在Y的情况下会发生什么:是遮蔽还是根本不生成对象伴生体?

等等,什么? :-) 你是不是想说“类和对象可以有前向声明,但是方法不能有”? - Gregor Scheidt
1
@GregorScheidt 不是方法也不是函数。嗯,Scala规范不知道什么是“方法”,所以我可能会称它们为函数,但我讨厌“函数”周围的名称混淆。 - Daniel C. Sobral

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接