Can';如果我在Scala中定义多个重载构造函数,我是否定义默认值?

Can';如果我在Scala中定义多个重载构造函数,我是否定义默认值?,scala,constructor,default,overloading,Scala,Constructor,Default,Overloading,我定义了多个构造函数,其中都有一些默认的参数值。看起来是正确的(我看不出任何歧义),但Scala(2.8)编译器抱怨: 构造函数的多个重载替代项定义默认参数 这是否意味着我根本无法为重载构造函数定义默认值 让我来说明一下情况(当然是初步的,但很有说明性): 直接取自编译器的源代码: // only one overloaded alternative is allowed to define default arguments 一般来说,我不建议将重载和默认值混合使用。即使没有冲突,也会使代码

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

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

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

让我来说明一下情况(当然是初步的,但很有说明性):


直接取自编译器的源代码:

// only one overloaded alternative is allowed to define default arguments
一般来说,我不建议将重载和默认值混合使用。即使没有冲突,也会使代码更难阅读

更新

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


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

重载失败,因为您(不必要地)使用默认值定义了多个构造函数。改为这样做:

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

你介意发布你的代码吗?在这种情况下使用工厂似乎是不必要的,而且违反了Occam的剃须刀。在所有情况下(手动应用默认值)IMHO实现构造函数会更漂亮,所以我已经完成了(看起来太老了,而且会自我重复)。如果我需要这么多的构造函数,我会仔细看看我的代码。这些天我几乎不需要一个参数……请不要把我对这个答案的投票视为我同意这种语言限制。但是如果在这种情况下主语是Int或String,不需要显式指定factor和doItRight参数吗?@Ivan,不,你不需要指定它们,因为您已经在主构造函数中为它们设置了默认值。我想这是因为您的代码没有达到最初预期的效果。用你的代码,你不能做“新A(“主题”,98,错误)”之类的事情。弗兰克,是的,你可以。主构造函数允许这样做。@MiaClarke好吧,也许我做错了,但是在scala 2.10上测试了几次之后,我得到了这样的结果:scala>val pa=new a(“dsa”,89,false):8:错误:类型不匹配;找到:需要字符串(“dsa”):双val pa=新A(“dsa”,89,false)^
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)
  }
}