Java 10 var关键字详解和示例教程(4)

尝试创建一个名为testVar的方法,如下所示,将下面的代码复制并粘贴到JShell中:

void testVar(boolean b) { var x; if (b) { x = 1; } else { x = 2; } System.out.println(x); }

方法不会被创建,而是会抛出编译错误。因为没有设置初始值,所以不能使用’var'。

null赋值

不允许进行null赋值,如下所示:

var name = null;

这将抛出异常“variable initializer is 'null'”。因为null不是一个类型。

与Lambda一起使用

另一个例子,没有Lambda初始化器。这与菱形操作符那个示例一样,RHS需要依赖LHS的类型推断。

var runnable = () -> {}

将抛出异常:“lambda expression needs an explicit target-type”。

var和方法引用

没有方法引用初始值,类似于Lambda和菱形运算符示例:

var abs = BigDecimal::abs

将抛出异常:“method reference needs an explicit target-type”。

var和数组初始化

并非所有数组初始化都有效,让我们看看什么时候var与[]不起作用:

var numbers[] = new int[]{2, 4, 6}

以下也不起作用:

var numbers = {2, 4, 6}

抛出的错误是: “array initializer needs an explicit target-type”。

就像上一个例子一样,var和[]不能同时用在LHS一边:

var numbers[] = {2, 4, 6}

错误: 'var' is not allowed as an element type of an array。

只有以下数组初始化是有效的:

var numbers = new int[]{2, 4, 6} var number = numbers[1] number = number + 3 不允许使用var字段 class Clazz { private var name; } 不允许使用var方法参数 void doAwesomeStuffHere(var salary){} 不能将var作为方法返回类型 var getAwesomeStuff(){ return salary; } catch子句中不能使用var try { Files.readAllBytes(Paths.get("c:\temp\temp.txt")); } catch (var e) {} 在编译时var类型究竟发生了什么?

“var”实际上只是一个语法糖,并且它不会在编译的字节码中引入任何新的结构,在运行期间,JVM也没有为它们提供任何特殊的指令。

结论

在这篇文章中,我介绍了“var”类型是什么以及它如何减少样板编码,同时保持Java的编译时类型检查。

然后,你了解了新的JShell工具,即Java的REPL实现,它可以帮助你快速学习Java语言,并探索新的Java API及其功能。你还可以使用JShell对复杂代码进行原型设计,而不是重复编辑、编译和执行的传统繁琐流程。

最后,你了解了所有var类型的功能和限制,例如什么时候可以和不可以使用var。写这篇文章很有意思,所以我希望你喜欢它并能给你带来帮助。

其他资源

JDK 10 Documentation

Hands-on Java 10 Programming with JShell.

Getting Started with Clean Code Java SE 9.

Overview of JDK 10 and JRE 10 Installation.

JEP 286: Local-Variable Type Inference.

Definite Assignment

关于作者

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/a7118cc15dfbb6ed73d0d82115f95c95.html