Новые разделители (пунктуаторы) Java 8+ - как и где они используются?

JLS для Java 8 представляет три новых разделителя:

...   @   ::

Многоточие (...) используется как "последний формальный параметр метода или конструктора". Но уже JLS для Java 7 описал этот формальный параметр как переменный параметр arity. Это не упоминается как разделитель.

Разделитель :: используется для формирования выражений ссылки на метод.

@ подразумевается "чтобы отличить объявление типа аннотации от обычного объявления интерфейса" и, таким образом, является частью объявления типа аннотации. Аннотации уже были частью JLS для Java 7. Я не вижу другого использования для "at-sign".

В поисках вопросов и ответов о разделителях Java 8+ я не нашел ничего, что объясняет использование новых разделителей.

Что делают оба разделителя ..., @ отделить? Как они используются?

2 ответа

Решение

Прежде всего, как вы заметили ... присутствовал в Java 7. (Я думаю, что он был введен в Java 5!) Но с Java 8 они перечислили его явно как один из токенов "разделителя".

Я не думаю, что это имеет какое-то реальное значение. Это просто редакционная поправка.

Что разделяют оба разделителя..., @?

Они на самом деле ничего не разделяют. Они классифицируются как "разделители", потому что они не являются операторами, литералами, идентификаторами или ключевыми словами.

Заметки:

  1. В Разделе 3.1 JLS 11 спецификация определяет альтернативный термин "пунктуатор". Некрасиво, но точнее.)

  2. Для JLS было бы бесполезно различать "разделители", которые отделяют от тех, которые этого не делают. Термин "разделитель" практически не используется в остальной части спецификации и, конечно, не в любом контексте, который подразумевает разделение.

  3. Существует прецедент, когда "разделители" не разделяются. Существующие токены (, ), {, }, [ а также ] на самом деле не действуют как разделители. Их цель - начать или закончить конструкцию.

  4. < а также > токены тоже немного странные. Лексическая грамматика называет их операторами, но в некоторых контекстах они действуют как (слабо) разделители.

Не пытайтесь читать слишком много в этом.

Верхнее предложение в вашей ссылке говорит

В этой главе описывается лексическая структура языка программирования Java.

Вот и весь смысл здесь. Это (полуформальное) описание синтаксиса языка Java. Мы не говорим здесь о семантике, это просто "формулировка". Описание различных элементов в синтаксисе языка программирования Java.

Вы могли бы сказать в public foo(Bar... vararg)

  • ( отделяет имя метода от списка параметров
  • ... отделяет тип параметра от имени параметра

Вы, вероятно, должны погрузиться в то, как разбора исходного кода Java, чтобы выяснить причины, почему ... указан как разделитель. Значение: этот термин получен из того, как парсер будет иметь дело с ..., не обязательно семантическое значение.

Другие вопросы по тегам