Конструкторы суперкласса в scala - PullRequest
4 голосов
/ 27 декабря 2011

Обработка Scala параметров конструктора суперкласса меня смущает ...

с этим кодом:

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

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

Объявлено, что LineElement расширяет ArrayElement, мне кажется странным, что Array(s) параметр в ArrayElement(Array(s)) создает экземпляр массива - время выполнения ???Это синтетический сахар этого скала или здесь что-то еще происходит?

Ответы [ 2 ]

9 голосов
/ 27 декабря 2011

Да, выражение Array(s) вычисляется во время выполнения.

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

Scala допускает выражения в вызовах конструктора суперкласса (аналогично тому, что Java делает с использованием super(...)). Эти выражения оцениваются во время выполнения.

2 голосов
/ 27 декабря 2011

На самом деле Array(s) оценивается во время выполнения, потому что используемая вами структура является эффективным вызовом первичного конструктора вашего суперкласса.

Напомним, что класс может иметь только первичный конструктор, который принимает аргументы в своем определении class A(param:AnyRef), другие конструкторы называются this и должны вызывать первичный конструктор (или связывать конструкторы до него). 1006 *

И такое ограничение существует при супер-вызове, то есть первичный конструктор подкласса вызывает супер-первичный конструктор.

Вот как можно увидеть такую ​​структуру 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;
  }
}
...