Scala对超类构造函数参数的处理令我困惑......
使用此代码:
class ArrayElement(val contents: Array[String]) {
...
}
class LineElement(s: String) extends ArrayElement(Array(s)) {
...
}
声明LineElement是为了扩展ArrayElement,我觉得Array(s)
中的ArrayElement(Array(s))
参数正在创建一个Array实例 - 运行时???这是scala的合成糖还是还有其他东西在这里?
答案 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;
}
}