10

Scala IDE で、コンパイルしようとしているクラスについて次のエラーが表示されます。

オブジェクト MapArea では、メソッド addAnim の複数のオーバーロードされた代替がデフォルト引数を定義します。

そうです、そうです!だから何?これの哲学が分からない…

アップデート:

(Tomasz Nurkiewicz が指摘したように) コンパイラがどのメソッドを選択すればよいかわからない状況が発生する可能性があることがわかりました。正確なコードは次のとおりです (今回はすべての元の名前と内容が保持されています)。

  def addAnim (name: String, x: Float, y: Float, tex: Buffer[Texture], fps: Int, percent: Float = 0): TImageSequence =
    addAnim (name, x, y, tex(0).getImage.getWidth, tex(0).getImage.getHeight, tex, fps, percent)

  def addAnim (name: String, x: Float, y: Float, w: Float, h: Float, tex: Buffer[Texture], fps: Int, percent: Float = 0): TImageSequence = {
     // do stuff
  }
4

3 に答える 3

11

デフォルトのパラメーターと同じ名前を持つ 2 つのメソッドを持つことはできません。Scala は、ターゲット メソッドの名前に基づいた名前でデフォルト値を取得するメソッドを生成するため、何らかの名前の衝突が発生する可能性があります。

scala> object Test {
     |   def m(i: String = "Default value") {}
     | }
defined module Test

scala> Test.`m$default$1`
res0: String = Default value
于 2012-06-07T08:50:48.963 に答える
6

コードは表示されていませんが、簡単な例を次に示します。

object C {
  def addAnim(x: Int = 42) {}
  def addAnim(y: String = "abc") {}
}

私が今電話した場合:

C.addAnim()

どのメソッドを呼び出す必要がありますか? 引数を指定しない場合、コンパイラはどのメソッドを意味するかを推測できないため、オブジェクトCはコンパイルされません。addAnim

于 2012-06-07T07:13:05.033 に答える
3

w と h もオプションにして、両方のメソッドを 1 つにまとめてみませんか。たとえば、

def addAnim (name: String, 
    x: Float, y: Float, 
    tex: Buffer[Texture], 
    fps: Int, 
    percent: Float = 0, 
    w: Float = Float.NaN, h:Float = Float.NaN): TImageSequence
于 2012-06-07T08:57:12.507 に答える