Почему Scala определяет оператор += для типов Short и Byte?

Учитывая следующий код scala:

var short: Short = 0
short += 1        // error: type mismatch
short += short    // error: type mismatch
short += 1.toByte // error: type mismatch

Я не сомневаюсь в базовой типизации - ясно, что «Short + value == Int».

Мои вопросы:
1. Можно ли вообще использовать этот оператор?
2. Если нет, то почему оператор доступен для использования в Short & Byte?

[И по расширению *=, |= &= и т. д.]


person Richard Sitze    schedule 11.06.2012    source источник
comment
На самом деле, у Short нет метода += или *=, вы можете посмотреть документ для Short scala-lang.org/api/current/index.html#scala.Short . x someoperator=y автоматически преобразуются компилятором в x = x someoperator y.   -  person Eastsun    schedule 11.06.2012
comment
@Eastsun Но Int тоже не :-) a op= b - это синтаксический сахар для расширенной формы: a = a op b, что объясняет ошибку типа (Short + Short -> Int). Это не объясняет, почему было принято такое решение или какую пользу эта конструкция может — или не может — иметь. (В C# совершенно законно делать byte+=1, но не byte=byte+1, и поведение специфично в стандарте — в C# существует неявный возврат к типу LHS).   -  person    schedule 11.06.2012
comment
@pst Да, вы можете делать то же самое на Java, что и на C# (если я правильно помню).   -  person Eastsun    schedule 11.06.2012
comment
@Eastsun Боже мой, я стараюсь забыть этот язык ;-) Я думаю, тогда есть два подхода, чтобы сделать его полезным: 1) неявное приведение/приведение обратно к LFS (аля C#) или 2) make Short + Short -> Short; первый просто не указан в соответствии с SLS, так что тогда просто остаются споры о продвижении типов при добавлениях... (Возможно, последнее связано с продвижением типов Java? Или просто ошибками переполнения? Или...)   -  person    schedule 11.06.2012


Ответы (1)


Проблема, похоже, в том, что "+(Short)" в классе Short определяется как:

def +(x: Short): Int

Поэтому он всегда возвращает Int.

Учитывая это, вы в конечном итоге не сможете использовать «оператор» +=, потому что операция + оценивается как Int, который (очевидно) не может быть назначен «короткой» переменной в версии без сахара:

short = short + short

Что касается вашего второго вопроса, он «доступен», потому что, когда компилятор scala находит такие выражения, как:

x K= y

И если x - это var, а K - любой символический оператор и в x есть метод K, то компилятор переводит или "удаляет сахар" в:

x = x K y

И затем пытается продолжить компиляцию с этим.

person Pablo Lalloni    schedule 14.06.2012