scala中的超类构造函数

时间:2011-12-27 10:51:51

标签: scala scala-2.8

Scala对超类构造函数参数的处理令我困惑......

使用此代码:

class ArrayElement(val contents: Array[String]) {
   ...
}

class LineElement(s: String) extends ArrayElement(Array(s)) {
  ...
}

声明LineElement是为了扩展ArrayElement,我觉得Array(s)中的ArrayElement(Array(s))参数正在创建一个Array实例 - 运行时???这是scala的合成糖还是还有其他东西在这里?

2 个答案:

答案 0 :(得分:9)

是的,Array(s)表达式在运行时进行评估。

class Foo (val x: Int)
class Bar (x: Int, y: Int) extends Foo(x + y)

Scala允许在超类的调用中使用表达式'构造函数(类似于Java使用super(...)时所做的那样)。这些表达式在运行时进行评估。

答案 1 :(得分:2)

实际上Array(s)是在运行时进行评估的,因为您使用的结构是对超类的主构造函数的有效调用。

要回想一下,一个类只能在其定义class A(param:AnyRef)中接受参数的主构造函数上,其他构造函数被称为this,并且要求调用主构造函数(或者链接构造函数)它)。

并且,超级调用存在这样的约束,即子类主构造函数调用超级主构造函数。

以下是如何查看此类Scala结构

class Foo (val x: Int)
class Bar (x: Int, y: Int) extends Foo(x + y)

Java对手

public class Foo {
  private x:int;
  public Foo(x:int) {
    this.x = x;
  }
  public int getX() {
    return x;
  }
}

public class Bar {
  private y:int;

  public Bar(x:int, y:int) {
    /**** here is when your array will be created  *****/
    super(x+y); 
    this.y = y;
  }

    public int getY() {
    return y;
  }
}