ZetCode

Java 局部变量类型推断

最后修改于 2020 年 7 月 13 日

Java 局部变量类型推断教程展示了 Java 10 的一项新功能——局部变量类型推断。类型推断是指编译器能够从赋值语句的右侧推断出数据类型的能力。

Java 10

Java 10 于 2018 年 3 月 20 日发布。它带来了几项 Java 增强提案 (JEP)。JEP 286 称为局部变量类型推断。

JEP 296

本文档通过减少编写 Java 代码的仪式性来改善开发者的体验,同时通过允许开发者省略局部变量类型声明中常常不必要的显式声明,来维持 Java 对静态类型安全的承诺。

它引入了一个新的 var 关键字,可以在赋值操作的左侧使用。Java 会从赋值的右侧自动推断出必要的数据类型。

Java 局部变量类型推断示例

在以下示例中,我们将创建一个简单的 Java 控制台应用程序来测试这项新功能。

$ wget http://download.oracle.com/otn-pub/java/jdk/10+46/76eac37278c24557a3c4199677f19b62/jdk-10_linux-x64_bin.tar.gz
$ tar xzvf jdk-10_linux-x64_bin.tar.gz
$ mv jdk-10 ~/bin

我们下载 Oracle JDK 并打开存档。我们将安装目录移动到我们选择的一个新目录。

$ ~/bin/jdk-10/bin/java --version
java 10 2018-03-20
Java(TM) SE Runtime Environment 18.3 (build 10+46)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+46, mixed mode)

我们验证 Java 版本。

$ mkdir -p src/com/zetcode bin
$ touch src/com/zetcode/JavaNewsEx.java
$ tree
.
├── bin
└── src
    └── com
        └── zetcode
            └── JavaNewsEx.java

我们创建目录结构。

com/zetcode/JavaNewsEx.java
package com.zetcode;

import java.util.List;

public class JavaNewsEx {

    public static void main(String[] args) {

        var name = "Jonathan";
        System.out.printf("The word %s has %d characters%n", 
            name, name.length());

        var age = 34;
        age += 12;

        System.out.println(age);

        var words = List.of("cloud", "fine", "pen", "dog",
            "temper", "sky", "book");

        System.out.println(words);
    }
}

这是示例的源代码。

var name = "Jonathan";

定义了一个名为 name 的新变量。我们使用了 var 关键字。类型是 String,这是从字符串字面量推断出来的。

$ ~/bin/jdk-10/bin/javac -d bin src/com/zetcode/JavaNewsEx.java
$ ~/bin/jdk-10/bin/java -cp bin com.zetcode.JavaNewsEx
The word Jonathan has 8 characters
46
[cloud, fine, pen, dog, temper, sky, book]

我们编译并运行示例。

在本教程中,我们使用了 Java 10 的新功能——局部变量类型推断。