Когда непризнанное выражение является допустимым выражением?
Я прочитал учебник по выражениям Oracle и не мог понять этого.
Хорошо известно, что следующая строка кода является допустимым синтаксисом Java:
new Object();
Однако, когда я пробую это с примитивным выражением:
(3 + 2);
Eclipse показывает ошибку компиляции "Левая часть назначения должна быть переменной".
Это верно не только для примитивов, но и для строковых литералов:
"arbitraryString";
Итак, каково правило, что неназначенное выражение должно быть действительным как строка кода Java?
Ответы
Ответ 1
Правило находится в Спецификация языка Java:
Некоторые типы выражений могут использоваться в качестве операторов, следуя за ними с точками с запятой.
ExpressionStatement:
StatementExpression:
- Назначение
- PreIncrementExpression
- PreDecrementExpression
- PostIncrementExpression
- PostDecrementExpression
- MethodInvocation
- ClassInstanceCreationExpression
Вы видите, что вызов конструктора является выражением. Но строковое литераловое или математическое выражение не является.
Ответ 2
Создание объекта или вызова или метода может иметь побочные эффекты, я думаю, что это основная причина этого, тогда как ничего не произойдет с арифметическим выражением.
Ответ 3
Строка, содержащая только
new Object();
или, если быть точнее,
new SomeClass();
является приемлемым, поскольку код конструктора SomeClass()
может быть всем, что мы хотим.
Но в случае строк, содержащих только
"foo";
или
2;//or (2+3);
компилятор знает, что помимо создания/повторного использования строкового литерала или целочисленного литерала этот код не делает ничего другого, что означает, что это, вероятно, какая-то ошибка программиста, поэтому компилятор не может его принять.
Ответ 4
Вы ищете разницу между выражениями и выражениями-выражениями. Выражения типа myVoid();
могут быть записаны как утверждение: это недействительные методы и т.д. (Это часть, которую вы знаете). Выражения, такие как (3 + 2);
и "arbitraryString"
, не имеют побочных эффектов. Их можно рассматривать только как значение, поскольку код не выполняется. Операторы выражения, такие как new Object();
, могут иметь побочные эффекты и выполнять код, а иногда просто требуется, чтобы этот код выполнялся и игнорировал возвращаемое значение. Поэтому компилятор допускает это.