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

不可能有两个具有默认参数且名称相同的方法。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 也设为可选来将这两种方法合二为一,例如

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 回答