2

コード:

object Link {

  //TYPE-1 (purely functional)
  def apply(name: String, target: Page, f: () => Unit, isExclusive: Boolean) = new Link(name, target, f, isExclusive)
  //..

  //TYPE-2 (purely side-effect)
  def apply(source: Page, target: Page, f: () => Unit, isExclusive: Boolean): Link = {
    val link = Link("LINK [" + source.getName + "]->[" + target.getName + "]", target, f, isExclusive)
    source += link
    link
  }

  //type-2 too
  def apply(source: Page, target: Page, isExclusive: Boolean): Link = Link (source, target, () => Unit, isExclusive)

}

説明:applyメソッドには 2 つのタイプがあります。タイプ 1 は単純にコンパニオン クラス コンストラクターが返すものを返し、タイプ 2 は何も返さず、代わりに新しいインスタンスで何かを行います。したがって、それらに対する2つの異なる引数のセット。ただし、アンダースコアでマークされている2 番目のタイプ 2 適用メソッドでエラーが発生します (投稿の下部を参照) 。_Link_

  def apply(source: Page, target: Page, isExclusive: Boolean): Link = _Link_ (source, target, () => Unit, isExclusive)

最初のタイプ 2 適用メソッドはいくつかの仕事を行い、2 番目 (および 3 番目と 4 番目...) のタイプ 2 適用メソッドでは、そこに書かれていることを複製するのではなく、最初のものを参照したいだけです。ただし、Scala-IDE では、type-1 のすべての適用メソッドがコメント化されていない限り、これを行うことはできません。Scala-IDE が署名の中で迷子になり、私の明白な意図が見えないようです。それとも私は何か間違ったことをしていますか?

エラー: 2 番目のapply方法では、次のようなエラーが表示されます。

オーバーロードされたメソッド値は代替手段で適用されます: (ソース: org.app.Page,ターゲット: org.app.Page,f: () => Unit,isExclusive: Boolean)org.app.meta.Link < and> (name: String ,target: org.app.Page,f: () => Unit,isExclusive: Boolean)org.app.meta.Link は適用できません (org.app.Page, org.app.Page, () => Unit .type、ブール値)

アップデート

タイプ 1 の apply メソッドは、タイプ 2 の最初のメソッドから問題なく呼び出されることに注意してください。

4

2 に答える 2

4

これは Scala コンパイラーのバグのようです (scalac 2.9.2 を使用すると、Eclipse の外部でエラーを再現できます)。

これが既知の問題である場合は、 Scala イシュー トラッカーを確認してください(必要に応じてチケットを開きます)。

アップデート

ここでHarald Meland が説明したように、これはコンパイラのバグではありません。

于 2012-06-14T11:28:11.413 に答える