Рассмотрим следующий класс, написанный на Java:
class NonNegativeDouble {
private final double value;
public NonNegativeDouble(double value) {
this.value = Math.abs(value);
}
public double getValue() { return value; }
}
Он определяет последнее поле с именем value
, которое инициализируется в конструкторе, взяв его параметр с одинаковым именем и применив к нему функцию. .
Я хочу написать что-то подобное на Scala. Сначала я попробовал:
class NonNegativeDouble(value: Double) {
def value = Math.abs(value)
}
Но компилятор жалуется: ошибка: значение перегруженного метода требует типа результата
Очевидно, компилятор считает, что выражение value
внутри выражения Math.abs (value)
относится к определяемому методу. Следовательно, определяемый метод является рекурсивным, поэтому мне нужно указать его возвращаемый тип. Итак, написанный мной код не выполняет то, что я ожидал: я хотел value
внутри Math.abs (value)
, чтобы ссылаться на параметр конструктора value
, а не определяемому методу. Это как если бы компилятор неявно добавил this.
в Math.abs (this.value)
.
Добавление val
или var
(или частных ...
вариантов) в параметр конструктора не Кажется, это помогает.
Итак, мой вопрос: могу ли я определить свойство с тем же именем, что и параметр конструктора, но, возможно, с другим значением? Если да, то как? Если нет, то почему?
Спасибо!