1

確かに非常に奇妙なこと。私は次のプロジェクト構造を持っています:

myproject/one/two

パッケージmyprojectの中にクラスがあります:

abstract class A (two: Buffer[Int])

そして、one私が持っているパッケージの中に:

object B extends A (Buffer[Int](1, 2, 3)) {

  val с = two.map(_ + 1)  // ERROR

}

ただし、エラーは次のように述べています。

オブジェクトmapはパッケージのメンバーではありません myproject/one/two

ここでパッケージを参照するのではなく、ローカル変数を参照することは完全に明らかであるため、これは明らかに誤りです...また、の後にtwoコンテキストアシストには表示されませんが、(Scala-IDE)に表示されます。これは意図された動作であり、私は何か間違ったことをしていますか、それともバグですか?this.BA

アップデート:

(Nicolas:Dによって同時に提案されました)(公開する)twoとして指定することにより、名前の衝突を解決することができました。val最初は気づかなかったのですが、プライベートで後継クラスでは利用できませんでした。それにもかかわらず、私はまだ疑問に思っています、なぜ、そしてどのようにして、変数が存在しないか、アクセスできないと言う代わりに、Scalaがパッケージをピックアップしたのですか?

4

1 に答える 1

3

あなたが思っているほど明確ではありません。修飾子がない場合、 two は抽象クラス A class に対してプライベートAです。したがって、 の宣言はaと同等abstract class A (private[this] A)です。object からfieldtwoが見えないことを意味しますB。直接的な結果として、コンパイラは、twovisible fromの唯一の定義でBあるパッケージを調べますtwo

于 2012-07-04T10:52:13.990 に答える