Какой тип токена точно является " var " в Java 10?

в последнем номере бюллетеня Хайнц Kabutz, а #255 Java 10: Выведенные Локальные Переменные, он показал, что var не является зарезервированным словом в Java 10, потому что вы также можете использовать var в качестве идентификатора:

public class Java10 {
    var var = 42; // <-- this works
}
, вы не можете использовать, т. е. assert в качестве идентификатора, как в var assert = 2, потому что assert - это зарезервированное слово.

как сказано в связанном бюллетене, тот факт, что var не зарезервированное слово-хорошая новость, потому что это позволяет код из предыдущих версий Java, который использует var как идентификатор для компиляции без проблем в Java 10.

Итак,var потом? Это ни явный тип, ни зарезервированное слово языка, поэтому разрешено быть идентификатором, однако он имеет особое значение при использовании для объявления локальной переменной в Java 10. Что именно мы называем это в контексте локальной переменной?

кроме того, помимо поддержки обратная совместимость (позволяя более старый код, содержащий var как идентификатор для компиляции), есть ли другие преимущества для var не быть зарезервированным словом?

2 ответов


по данным JEP-286: вывод типа локальной переменной, var is

не ключевое слово, это зарезервированное имя типа.

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

поскольку это не "зарезервированное ключевое слово", его можно использовать в именах переменных (и пакете names), но не в именах классов или интерфейсов.

Я бы подумал, что самая большая причина не делать var зарезервированное ключевое слово имеет обратную совместимость со старым исходным кодом.


var-это зарезервированное имя типа var не является ключевым словом, это зарезервированный тип имя.

мы можем создать переменную с именем "var".

вы можете узнать здесь для получения более подробной информации.

var var = 5; // syntactically correct
// var is the name of the variable
“var” as a method name is allowed.

public static void var() { // syntactically correct 
}
“var” as a package name is allowed.

package var; // syntactically correct
“var” cannot be used as the name of a class or interface.
class var{ } // Compile Error
LocalTypeInference.java:45: error: 'var' not allowed here
class var{
      ^
  as of release 10, 'var' is a restricted local variable type and cannot be used for type declarations
1 error

interface var{ } // Compile Error

var author = null; // Null cannot be inferred to a type 
LocalTypeInference.java:47: error: cannot infer type for local variable author
                var author = null;
                    ^
  (variable initializer is 'null')
1 error