注:本人参考了openjdk官网,由于openjdk是开源的,所以不存在侵权行为,本章只为学习,我觉得没有什么比官网更具有话语权
1、jdk10的var的类型推测:就是这种处理将仅限于具有初始值设定项的局部变量、增强型 -循环中的索引以及在传统 -循环中声明的局部变量;它不适用于方法形式、构造函数形式、方法返回类型、字段、捕获形式或任何其他类型的变量声明。允许在声明隐式类型 lambda 表达式的形式参数时使用var ,通过在枚举(泛型枚举)中允许类型变量,并对枚举常量执行更清晰的类型检查,增强 Java 语言中构造的表达能力enum
2、jdk10提出这个方案的原因:也是因为开发人员认为本地方法里面的类型声明通常被认为是不必要的,并且几乎所有其他流行的静态类型“大括号”语言,无论是在JVM上还是在JVM上,都已经支持某种形式的局部变量类型推断:C++(auto),C#(var),Scala(var/val),Go(声明)。Java 几乎是唯一一种没有接受局部变量类型推断的流行静态类型语言;在这一点上,这应该不再是一个有争议的功能
3、我举几个反例吧:
3.1、比如说这个静态变量,就会报错
package com.example.jdk10;
public class LocalVariable {
public static void main(String[] args) {
}
var a=90;
}
3.2、方法返回类型也不能用var
4、在举个简单的正面例子(抛开那些简单的方法里面的局部推测)
隐式的lambada(至于lambada表达式里面的变量都是final类型,这种基础知识就不提了)
package com.example.jdk10;
import java.util.Arrays;
import java.util.List;
public class LocalVariable {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach((var name) -> System.out.println("Hello, " + name));
}
}
4.1运行结果:
4.2 在枚举(泛型枚举)中使用类型变量
package com.example.jdk10;
public enum Foo {
APPLE("red"), BANANA("yellow"), ORANGE("orange");
private String color;
Foo(String color) {
this.color = color;
}
public String getColor() {
return color;
}
}
package com.example.jdk10;
public class LocalVariable {
public static void main(String[] args) {
var apple = Foo.APPLE;
System.out.println(apple.getColor()); // 返回 "red"
var banana = Foo.BANANA;
System.out.println(banana.getColor()); // 返回 1
}
}