Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala构造函数重载?_Scala - Fatal编程技术网

Scala构造函数重载?

Scala构造函数重载?,scala,Scala,如何在Scala中提供重载构造函数?值得明确指出的是,Scala中的辅助构造函数必须调用主构造函数(如landon9720中的)应答,或者调用同一类中的另一个辅助构造函数作为其第一个操作。它们不能像在Java中那样简单地显式或隐式调用超类的构造函数。这确保了主构造函数是类的唯一入口点 class Foo(x: Int, y: Int) { def this(x: Int) = this(x, 0) // default y parameter to 0 } class Foo(x

如何在Scala中提供重载构造函数?

值得明确指出的是,Scala中的辅助构造函数必须调用主构造函数(如landon9720中的)应答,或者调用同一类中的另一个辅助构造函数作为其第一个操作。它们不能像在Java中那样简单地显式或隐式调用超类的构造函数。这确保了主构造函数是类的唯一入口点

 class Foo(x: Int, y: Int) {
     def this(x: Int) = this(x, 0) // default y parameter to 0
 }
class Foo(x: Int, y: Int, z: String) {  
  // default y parameter to 0  
  def this(x: Int, z: String) = this(x, 0, z)   
  // default x & y parameters to 0
  // calls previous auxiliary constructor which calls the primary constructor  
  def this(z: String) = this(0, z);   
}

从Scala 2.8.0开始,还可以为构造函数和方法参数设置默认值。像这样

scala> class Foo(x:Int, y:Int = 0, z:Int=0) {                           
     | override def toString() = { "Foo(" + x + ", " + y + ", " + z + ")" }
     | }
defined class Foo

scala> new Foo(1, 2, 3)                                                    
res0: Foo = Foo(1, 2, 3)

scala> new Foo(4)                                                          
res1: Foo = Foo(4, 0, 0)

带有默认值的参数必须位于参数列表中没有默认值的参数之后。

在查看我的代码时,我突然意识到我的构造函数有点过载。然后我想起了那个问题,回来再回答:

在Scala中,不能重载构造函数,但可以通过函数来实现

此外,许多人选择将伴生对象的
apply
函数作为相应类的工厂

使该类抽象并重载
apply
函数来实现实例化该类,您就有了重载的“构造函数”:

abstract class Expectation[T] extends BooleanStatement {
    val expected: Seq[T]
    …
}

object Expectation {
    def apply[T](expd:     T ): Expectation[T] = new Expectation[T] {val expected = List(expd)}
    def apply[T](expd: Seq[T]): Expectation[T] = new Expectation[T] {val expected =      expd }

    def main(args: Array[String]): Unit = {
        val expectTrueness = Expectation(true)
        …
    }
}
请注意,我明确定义了每个
apply
以返回
expection[T]
,否则它将返回一个duck类型的
expection[T]{val expected:List[T]}

试试这个

class A(x: Int, y: Int) {
  def this(x: Int) = this(x, x)
  def this() = this(1)
  override def toString() = "x=" + x + " y=" + y
  class B(a: Int, b: Int, c: String) {
    def this(str: String) = this(x, y, str)
    override def toString() =
      "x=" + x + " y=" + y + " a=" + a + " b=" + b + " c=" + c
  }
}

但是,这不适用于非平凡的默认值。所以
class Foo(val x:Int,y:Int=2*x)
不起作用。@Jörgen Lundberg:您编写的参数中,默认值必须在参数列表中没有默认值的参数之后。这是错误的,
newfoo(x=2,z=4)
将打印
Foo(2,0,4)
@user2987828我的意思是你不能写新的Foo(12,x=2)你必须写新的Foo(x=2,12)。您可以编写新的Foo(12,y=2),然后您将得到Foo(12,2,0)@Jon McAuliffe:Bad-example?如果没有第二个和第三个构造函数,用户仍然可以调用
newfoo(x=2,z=4)
newfoo(z=5)
,如果您将第一行更改为
classfoo(x:Int=0,y:Int=0,z:String){
Named/Default参数直到Scala 2.8才到达。值得一提的是如何使用重载构造函数。
new
关键字即使对于case类也是必需的,这一点很重要。