Java 10中的“var”究竟是什么类型的标记?

2022-09-02 03:49:39

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

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

但是,您不能使用 作为标识符,如 中所示,因为 是一个保留字。assertvar assert = 2assert

正如在链接的时事通讯中所说,这不是一个保留字的事实是好消息,因为这允许以前版本的Java代码用作标识符,在Java 10中没有问题地编译。varvar

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

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


答案 1

根据 JEP-286:局部变量类型推断,是var

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

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

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

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


答案 2

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

推荐