Scala - 奇怪的编译错误(方法的多个重载替代定义默认参数)

时间:2012-06-07 07:10:02

标签: scala

在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
  }

3 个答案:

答案 0 :(得分:10)

不可能有两个具有默认参数且名称相同的方法。 Scala生成方法以获取具有基于目标方法名称的名称的默认值,因此可能发生某种名称冲突。

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

scala> Test.`m$default$1`
res0: String = Default value

答案 1 :(得分:5)

您没有显示您的代码,但这是一个简单的示例:

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

如果我现在打电话:

C.addAnim()

应该调用哪个方法?对象C将无法编译,因为编译器无法在不提供任何参数时猜测您所指的addAnim方法。

答案 2 :(得分:3)

为什么不将两种方法合二为一,也可以将w和h作为选项,例如

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