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 は既に (コンパイラによって生成された) ケース クラス コンパニオン オブジェクト Z として定義されています

関数定義内にある場合、ケース クラス定義の後にケース クラスのコンパニオン オブジェクトを定義することは許可されていないようです。これはコンパイラのバグですか、それとも意図的なものですか? 後者の場合、なぜですか?

4

2 に答える 2

14

これは既知のバグです:SI-3772:コンパニオンとメソッド所有のケースクラス。これは部分的に修正されていますが、OPの問題はまだ残っています。修正したい場合は投票してください。

于 2011-12-21T14:35:31.833 に答える
1

前者が許可されて後者が許可されない理由は、クラスとオブジェクトは前方定義を持つことができますが、定義はできないためです。したがって、コンパイラがケースクラスで定義されたものと混在できるのはなぜですかobject X。2番目のケースではそうすることができません。

この場合はどうなるのだろうかY: シャドウイングまたはオブジェクト コンパニオンがまったく生成されないのでしょうか?

于 2011-12-21T15:10:10.693 に答える