20

在上一期 Heinz Kabutz 的时事通讯#255 Java 10: Inferred Local Variables中,表明它var不是 Java 10 中的保留字,因为您也可以将var其用作标识符:

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

但是,您不能使用 ieassert作为标识符,如var assert = 2,因为assert是保留字。

正如链接的时事通讯中所说,var不是保留字的事实是个好消息,因为这允许来自以前版本的 Java 的var用作标识符的代码在 Java 10 中编译而不会出现问题。

那么,那var又是什么呢?它既不是显式类型也不是语言的保留字,因此它可以作为标识符,但是在 Java 10 中用于声明局部变量时它确实具有特殊含义。我们在上下文中究竟如何称呼它局部变量声明?

此外,除了支持向后兼容性(通过允许包含作为标识符的旧代码进行编译)之外,作为保留字var还有其他优点吗?var

4

2 回答 2

22

根据JEP-286: Local-Variable Type Inferencevar

不是关键字;相反,它是一个保留的类型名称

(JEP 的早期版本为保留类型名称或上下文相关关键字留出了空间;最终选择了前一种路径。)

因为它不是“保留关键字”,所以仍然可以在变量名称(和包名称)中使用它,但不能在类或接口名称中使用它。

我认为不var使用保留关键字的最大原因是与旧源代码的向后兼容性。

于 2018-03-03T21:09:58.717 回答
5

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
于 2018-03-27T11:39:42.133 回答