Groovy работает не так, как Java В этом коде - PullRequest
4 голосов
/ 30 октября 2011

Я посмотрел на этот вопрос здесь .Проблема с этим вопросом заключается в следующей строке:

Integer i3 = (Integer) -128; /*** Doesn't compile ***/

Как говорят некоторые из ответов:

The compiler interprets the - as the two-arg minus operator, i.e. it's trying to subtract 128 from some other number named Integer, but there's no such variable in scope

Ответы выглядят для меня правильными.Теперь в Groovy я попробовал тот же код, что и раньше:

Integer i3 = (Integer) -128; /*** compiles!!! ***/

, даже этот код строки компилируется:

Integer i3 = (Integer) -(128); /*** compiles ***/

Как Groovy выполняет эту операцию?Все ли языки JVM делают это?Что происходит за кулисами в случае Groovy.

Не нарушает ли это правило Java?Бит запутан.

Для справки я пометил рабочий код Groovy здесь

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 30 октября 2011

Groovy не является Java.

Он не должен соответствовать спецификации Java, и в этом случае ... не соответствует.

Редактировать для ясности Я думаю, что вас смущает то, что вы не понимаете, что это два разных языка.И Groovy-компилятор, и Java-компилятор выводят байт-код из вашего исходного кода, который затем выполняется на JVM (виртуальная машина Java).JLS (спецификация языка Java) применяется только к языку Java .Groovy не должен придерживаться этого.

1 голос
/ 30 октября 2011

Как интерпретировать знак минус в куске кода - это функция компилятора, которая реализует определение языка.Это действительно не имеет отношения к системе времени выполнения, в которой код будет фактически выполняться - в данном случае, JVM.Таким образом, разные языки могут иметь одинаковые символы / ключевые слова и т. Д. Ведут себя по-разному.

0 голосов
/ 30 октября 2011
Integer i3 = (Integer) -128;
println i3

компилируется и работает под Groovy 1.8

...