如果我在Scala中定义多个重载的构造函数,我不能定义默认值吗?

时间:2010-10-10 08:22:48

标签: scala constructor default overloading

我已经定义了多个构造函数,并且在所有构造函数中都有一些默认参数值。看起来是正确的(我看不出任何歧义),但Scala(2.8)编译器抱怨:

  

构造函数的多个重载替代定义默认参数

这是否意味着我根本无法为重载的构造函数定义默认值?

让我说明一下情况(当然是原始的,但是说明性的):


class A(subject : Double, factor : Int = 1, doItRight : Boolean = true) {

  def this (subject : Int, factor : Int = 1, doItRight : Boolean = true) = {
    this(subject.toDouble , factor, doItRight)
  }

  def this (subject : String, factor : Int = 1, doItRight : Boolean = true) = {
    this(subject.toDouble , factor, doItRight)
  }

  def this () = {
    this(defaultSubject)
  }

}



2 个答案:

答案 0 :(得分:9)

直接从编译器的源代码中获取:

// only one overloaded alternative is allowed to define default arguments

一般情况下,我不建议您混合重载和默认值。即使没有冲突,它也会使你的代码更难阅读。

更新

由于您添加了代码,现在很清楚您不希望/需要覆盖每个辅助构造函数的默认值。在您的特定情况下,我甚至可能会质疑是否需要这些额外的构造函数; Int => Double已经可以作为隐式转换使用了,String => Double看起来可能正在变换类型系统:)

另外......作为重载构造函数的替代方法,您可以仅使用默认值定义主构造函数,然后重载伴随对象的apply方法并将其用作工厂。这当然是完全可选的,但它通过使用案例类迅速成为一种模式。

答案 1 :(得分:4)

重载失败,因为您(无意识地)使用默认值定义多个构造函数。这样做:

class A(subject : Double, factor : Int = 1, doItRight : Boolean = true) {

  def this (subject : Int) = {
    this(subject.toDouble)
  }

  def this (subject : String) = {
    this(subject.toDouble)
  }

  def this () = {
    this(defaultSubject)
  }
}