20
votes

In the last issue of Heinz Kabutz's newsletter, #255 Java 10: Inferred Local Variables, it is shown that var is not a reserved word in Java 10, because you can also use var as an identifier:

public class Java10 {
    var var = 42; // <-- this works
}

However, you cannot use i.e. assert as an identifier, as in var assert = 2, because assert is a reserved word.

As it's told in the linked newsletter, the fact that var is not a reserved word is good news, because this allows code from previous versions of Java that uses var as an identifier to compile without problems in Java 10.

So, what's var then? It's neither an explicit type nor a reserved word of the language, so it's allowed to be an identifier, however it does have a special meaning when used to declare a local variable in Java 10. What exactly do we call it in the context of a local variable declaration?

Additionally, apart from supporting backwards compatibility (by allowing older code that contains var as an identifier to compile), are there other advantages to var not being a reserved word?

2
@FedericoPeraltaSchaffner The byte code with var var = 42 or Integer var = 42 is exactly the same; it's just for the compiler here, so it's a type name. Notice that this is not very different than Integer Integer = 42 (upvote to re-open, really wanted to make this one an answer too)Eugene
I've edited the canonical answer.Brian Goetz
@bhspencer Correction; it was updated from the disjunction of the two (reflecting the options out the outset of the project) to "reserved type identifier" (reflecting the final outcome.) JEPs are living documents; it is common for the design to evolve between start and end, and ideally we update the JEP to reflect reality as we go.Brian Goetz
@bhspencer Because restricted type identifiers were a simpler and cleaner way to specify and implement the desired result. We could have used a restricted keyword, but it would have been more intrusive in the grammar and specification, for no incremental benefit.Brian Goetz
The specification drafts for this features has been available publicly for a year; final version (prior to integration into the master spec) is here: bugs.openjdk.java.net/secure/attachment/72914/… (linked from bugs.openjdk.java.net/browse/JDK-8151553).Brian Goetz

2 Answers

22
votes

According to JEP-286: Local-Variable Type Inference, var is

not a keyword; instead it is a reserved type name.

(Earlier versions of the JEP left room for implementing either as a reserved type name or as a context-sensitive keyword; the former path was ultimately chosen.)

Because it's not a "reserved keyword", it is possible to still use it in variable names (and package names), but not in class or interface names.

I would think the biggest reason for not making var a reserved keyword is backwards compatibility with old source code.

5
votes

var is a reserved type name var is not a keyword, It’s a reserved type name.

We can create a variable named “var”.

you can read here for more details.

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