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

那么三元运算符呢?

var x = 1 > 0 ? 10 : -10 int i = x

现在,如果在三元运算符的RHS中使用不同类型的操作数会怎样?让我们来看看:

var x = 1 > 0 ? 10 : "Less than zero"; System.out.println(x.getClass()) //Integer var x = 1 < 0 ? 10 : "Less than zero"; System.out.println(x.getClass()) // String

这两个例子是否可以说明var的类型是在运行时决定的?绝对不是!让我们以旧方式实现同样的逻辑:

Serializable x = 1 < 0 ? 10 : "Less than zero"; System.out.println(x.getClass())

Serializable是其中两个操作数最具兼容性和最专的有类型(最不专有的类型是java.lang.Object)。

String和Integer都实现了Serializable。Integer从int自动装箱。换句话说,Serializable是两个操作数的LUB(最小上限)。所以,这表明往前数第三个例子中的var类型也是Serializable。

让我们转到另一个主题:将var类型传给方法。

var类型与方法

我们先声明一个名为squareOf的方法,这个方法的参数为BigDecimal类型,并返回参数的平方,如下所示:

BigDecimal squareOf(BigDecimal number) { var result= number.multiply(number); return result; } var number = new BigDecimal("2.5") number = squareOf(number)

现在让我们看看它如何与泛型一起使用。我们声明一个名为toIntgerList的方法,参数类型为List<T>(泛型类型),并使用Streams API返回一个整数列表,如下所示:

<T extends Number> List<Integer> toIntgerList(List<T> numbers) { var integers = numbers.stream() .map(Number::intValue) .collect(Collectors.toList()); return integers; } var numbers = List.of(1.1, 2.2, 3.3, 4.4, 5.5) var integers = toIntgerList(numbers) var类型与匿名类

最后,让我们看一下var和匿名类。我们通过实现Runnable接口来使用线程,如下所示:

<T extends Number> List<Integer> toIntgerList(List<T> numbers) { var integers = numbers.stream() .map(Number::intValue) .collect(Collectors.toList()); return integers; } var numbers = List.of(1.1, 2.2, 3.3, 4.4, 5.5) var integers = toIntgerList(numbers)

到目前为止,我已经介绍了Java 10的新特性——“var”类型,它减少了样板编码,同时保持了Java的编译时类型检查。我还通过实例说明了可以用它做些什么。接下来,你将了解var类型的局限性以及不能将它用在哪些地方。

var message = "running..." //effectively final var runner = new Runnable(){ @Override public void run() { System.out.println(message); }} runner.run() “var”的局限性

接下来,你将看一些示例,以便了解var类型功能无法做到的事情。

jshell提示符将会告诉你代码出了什么问题,你可以利用这些交互式的即时反馈。

应该要进行初始化

第一个也是最简单的原则就是不允许没有初始值的变量。

var name;

你将得到一个编译错误,因为编译器无法推断这个局部变量x的类型。

不允许复合声明

尝试运行这行代码:

var x = 1, y = 3, z = 4

你将得到一个错误消息:复合声明中不允许使用’var'。

不支持确定性赋值(Definite Assignment)

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

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