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

标签 scala constructor default overloading

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

multiple overloaded alternatives of constructor define default arguments

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

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


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

}



最佳答案

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

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

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

更新

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

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

关于scala - 如果我在 Scala 中定义多个重载构造函数,我不能定义默认值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3899571/

相关文章:

scala - 在 sbt 中,如何与一个版本中不需要的依赖项交叉构建?

scala - 我可以定义一个 bang 运算符方法,但我不能在 Scala 中调用它。为什么?

C++在复制构造函数中初始化列表赋值并在复制构造函数中崩溃

Java 包级访问

date - 带有公式的 SSRS 日期默认值禁用参数

sql - 表达式不能与默认约束一起使用。在azure synapse sql中仅指定默认约束的常量

java - 如何处理多个 Akka Actor?

scala - Lang 和 requestLang 中的值不明确

java - Java和C#的构造函数执行顺序及其对代码移植的实际影响

java - 不使用访问修饰符和将访问修饰符与构造函数一起使用时会产生不同的结果