是否可以在scala中重载构造函数?

Zif*_*ong 3 overriding scala

我的问题是,如果可以在scala中重载构造函数?

所以我可以编写如下代码:

var = new Foo(1)
var = new Foo("bar")
Run Code Online (Sandbox Code Playgroud)

如果不可能,有没有相同的技巧?

Dav*_*ith 9

当然,但有限制.Scala要求您的一个构造函数是"主要的".主构造函数具有将构造函数args放在类名后面的特殊,方便的语法.也可以定义其他"辅助"构造函数,但是它们需要调用主构造函数.这与Java不同,而且更具限制性.它以这种方式完成,因此构造函数args可以被视为字段.

你的例子看起来像

class Foo(myArg:String){ //primary constructor
   def this(myIntArg:Int) = this(myIntArg.toString) //secondary constructor
}

val x = new Foo(1)
val y = new Foo("bar")
Run Code Online (Sandbox Code Playgroud)


Lan*_*dei 6

正如您在Dave Griffith的示例中所看到的,主要构造函数必须是"最一般"的构造函数,在任何其他构造函数必须调用它(直接和间接)的意义上.正如您可以想象的那样,这有时会导致丑陋的主要构造函数.一个常见的策略是使用伴侣对象隐藏丑陋(并且您不需要键入"new"):

class Foo private (arg:Either[String, Int]){ 
   ...
}

object Foo {
   def apply(arg:String) = new Foo(Left(arg))
   def apply(arg:Int) = new Foo(Right(arg))  
}

val a = Foo(42)
val b = Foo("answer")
Run Code Online (Sandbox Code Playgroud)

当然,如果你想从你的班级继承,你必须要小心(例如,在上面的例子中这是不可能的)