Какова концептуальная разница между "ограниченным ключевым словом" и "зарезервированным типом имени" в Java 10?

Java 10 поставляется с новым локальным переменным. Токен var может использоваться для уменьшения шаблона, необходимого при объявлении переменной. например.

var s = "hello";

В соответствии с Какой тип токена точно "var " в Java 10? этот новый токен не является" ключевым словом ", а скорее" зарезервированным типом имени ". Таким образом, слово" var" все еще может использоваться как имя переменной, которое поддерживает обратную совместимость с существующим кодом.

var var = "you can do this";

Когда функция "module" была введена в Java 9, тип этого нового токена (наряду с его 9 другими связанными токенами) назывался "ограниченными ключевыми словами". То есть они считались ключевыми словами только в определенных контекстах конкретных ограничений. например вы все равно можете иметь переменные, называемые модулем.

Когда новые возможности языка были добавлены в С++ таким образом, что они не сбивали существующие пользовательские символы, они назывались "контекстно-зависимые ключевые слова".

Существует ли концептуальная разница между новым токеном "зарезервированное имя типа" var в Java 10 и "контекстно-зависимым ключевым словом" или "ограниченным ключевым словом". То есть не новый токен var действительно просто ключевое слово при определенных ограничениях для конкретного контекста. Если это так, то почему его просто не добавили в список "ограниченных ключевых слов"?

Чтобы добавить к моей путанице, в текущей черновике JLS говорится, что:

Последовательность символов var обычно рассматривается как идентификатор, но в некоторых особых случаях действует, как если бы это было ключевое слово.

Это определение, безусловно, звучит как "ограниченное ключевое слово".

Ответ 1

Самое следующее предложение раздела, которое вы цитируете (3.8: Ключевые слова):

Еще десять символьных последовательностей - это ключевые слова с ограничениями: открытые, модулируемые, требуемые, транзитивные, экспортные, открытые, используемые, используемые и предоставляемые.

Обратите внимание, что var в этом списке нет. Упоминание var в этом разделе было включено именно для того, чтобы было ясно, что, хотя в некоторых случаях он может действовать как ограниченное ключевое слово, и, хотя это может звучать для вас в вашем неофициальном чтении спецификации, это не так.

Контекстно-зависимые ключевые слова являются одним из инструментов, которыми мы располагаем для развития языка в совместимом режиме; зарезервированные идентификаторы - это другие. В этом конкретном случае либо можно было применить, и, в конце концов, последний инструмент считался (для целей спецификации и реализации компилятора) предпочтительным.

Но позвольте мне спросить: если вы не можете сказать разницу между этими двумя (как вы говорите, один из них, безусловно, звучит как "другой" ), с вашей точки зрения, как ни автор спецификации, ни разработчик компилятора, какая разница это делает вам? В любом случае вы давно поняли основные аспекты для разработчиков.