那么三元运算符呢?
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)