2012-06-11 2 views
5

Учитывая следующий код SCALA:Почему Scala определяет оператор «+ =» для типов Short и Byte?

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

Я не оспариваю основной набор текста - это ясно, что «Short + значение == Int».

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

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

+0

На самом деле, у Short нет метода «+ =» или «* =», вы можете посмотреть документ для Short http://www.scala-lang.org/api/current/index.html#scala. Короткий . x someoperator = y автоматически переводятся в x = x someoperator y компилятором. – Eastsun

+0

@ Eastsun Но и Int :-) 'a op = b' не является синтаксическим сахаром для расширенной формы:' a = a op b', что объясняет ошибку типа (Short + Short -> Int). Он не объясняет, почему было принято решение или что использовать эту конструкцию, возможно, или нет. (В C# вполне законно делать 'byte + = 1', но не' byte = byte + 1', а поведение специфично в стандарте - есть неявный откат к типу LHS в C#). –

+0

@pst Да, вы можете сделать то же самое на Java, что и на C# (если я правильно помню.) – Eastsun

ответ

1

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

def +(x: Short): Int 

Так он всегда возвращает Int.

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

short = short + short 

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

x K= y 

и если х вар и к любому символическому оператору и есть метод к й то компилятор переводит или «desugar» его на:

x = x K y 

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

Смежные вопросы