6.3 局部变量类型推断
JDK 10的新特性
局部变量的显示类型声明,常常被认为是不必须的,给一个好听的名字反而可以很清楚的表达出下面应该怎样继续。本新特性允许开发人员省略通常不必要的局部变量类型声明,以增强Java语言的体验性、可读性。
使用举例
//1.局部变量的实例化
var list = new ArrayList<String>();
var set = new LinkedHashSet<Integer>();
//2.增强for循环中的索引
for (var v : list) {
System.out.println(v);
}
//3.传统for循环中
for (var i = 0; i < 100; i++) {
System.out.println(i);
}
//4. 返回值类型含复杂泛型结构
var iterator = set.iterator();
//Iterator<Map.Entry<Integer, Student>> iterator = set.iterator();
/**
* @Description: Local-Variable Type Inference 局部变量类型推断
* @Author: JOKER
* @Params: []
* @return: void
*/
@Test
public void testVar() throws Exception {
//例子1
LinkedHashSet<Integer> set = new LinkedHashSet<>();
Iterator<Integer> iterator = set.iterator();
var set1 = new LinkedHashSet<>();
var iterator1 = set1.iterator();
//例子2
URL url = new URL("https://www.baidu.com");
URLConnection connection = url.openConnection();
Reader reader = new BufferedReader(new
InputStreamReader(connection.getInputStream()));
var url1 = new URL("https://www.baidu.com");
var connection1 = url1.openConnection();
var reader1 = new BufferedReader(new
InputStreamReader(connection1.getInputStream()));
//例子3
var list = Arrays.asList(1,3,5,6,8);
//2.增强for循环中的索引
for(var v : list) {
System.out.println(v);
}
}
不适用场景
声明一个成员变量
声明一个数组变量,并为数组静态初始化(省略new的情况下)
方法的返回值类型
方法的参数类型
没有初始化的方法内的局部变量声明
作为catch块中异常类型
Lambda表达式中函数式接口的类型
方法引用中函数式接口的类型
代码举例:
声明一个成员变量,并初始化值为null
声明一个数组变量,并为数组静态初始化(省略new的情况下)
没有初始化的方法内的局部变量声明
方法的返回值类型
方法的参数类型
构造器的参数类型
作为catch块中异常类型
Lambda表达式中函数式接口的类型
方法引用中函数式接口的类型
注意:
var不是一个关键字,而是一个类型名,将它作为变量的类型。不能使用var作为类名。
这不是JavaScript。var并不会改变 Java是一门静态类型语言的事实。编译器负责推断出类型,并把结果写入字节码文件,就好像是开发人员自己敲入类型一样。
局部变量类型推断的升级()
/**
* @Description: 在var上添加注解的语法格式,在jdk10中是不能实现的。在JDK11中加入了这样的语法
* @Author: JOKER
* @Params: []
* @return: void
*/
@Test
public void test(){
//错误的形式: 必须要有类型, 可以加上var
//Consumer<String> con1 = (@Deprecated t) ->System.out.println(t.toUpperCase());
//正确的形式:
//使用var的好处是在使用lambda表达式时给参数加上注解。
Consumer<String> con2 = (@Deprecated var t) ->System.out.println(t.toUpperCase());
}