Простое выражение типа
(x) - y
интерпретируется по-разному в зависимости от того, является ли x
именем типа или нет. Если x
не является именем типа, (x) - y
просто вычитает y
из x
. Но если x
- это имя типа, (x) - y
вычисляет отрицание y
и выводит результирующее значение на тип x
.
В типичном компиляторе C или С++ вопрос о том, является ли тип x
типом или нет, отвечает, потому что парсер передает эту информацию в лексер, как только он обрабатывает объявление typedef или struct. (Я думаю, что такое требуемое нарушение уровней было самой противной частью дизайна C.)
Но в Java x
не может быть определен до конца в исходном коде. Как компилятор Java рассогласовывает такое выражение?
Ясно, что компилятору Java требуется несколько проходов, поскольку Java не требует объявления перед использованием. Но это, по-видимому, означает, что первый проход должен выполнять очень неряшливое задание при разборе выражений, а затем в более позднем прохождении делать другой, более точный разбор выражений. Это кажется расточительным.
Есть ли лучший способ?