首页 课程 师资 教程 报名

编程技术分享:Java10局部变量类型推断

  • 2020-06-10 16:22:52
  • 2121次 动力节点

在所有Java10中出现的JEP规范中,最有趣,并获得了最多讨论的,非JEP286-局部变量类型推断(Local-Variable Type Inference)。

编程技术分享:Java10局部变量类型推断

什么是局部变量类型推断

在Java7中的菱形操作符允许我们这样写代码:

List<String> data=new ArrayList<>();

在Java8中,你可以这样写:

List<String> data=new ArrayList();

右操作数能够根据左操作数推断出类型。Java9中,在匿名内部类中,也同样适用(修复了该问题)。

Java10更进了一步

List<Map> data = new ArrayList();

这个代码在Java10中,可以这样写:

var data = new ArrayList<Map>();

注意,这种写法,我们在右操作数中必须确定泛型的具体参数类型,否则,Java会判定data为一个ArrayList<Object>。

局部变量类型推断允许开发者在申明局部变量的时候不用显示申明变量的类型(在方法中的,初始代码块,for循环,if-else这样的代码块中的变量),这些类型会由JDK来推断。

我们能在什么地方使用?

下面我用一段代码来演示,什么时候我们能使用var声明变量:

public class LegalLocalVarInferenceDemo{
 //在static这样的静态/初始代码块中
 static {
 var anotherName = "Sanaulla";
 System.out.println("Hello, " + anotherName);
 }
 public static void main(String[] args){
 //可以在方法局部变量中
 var name = "Mohamed Sanualla";
 System.out.println("Hello " + name);
 var data = new ArrayList<Map>();
 data.add(Map.of("key1", "value1", "key2", "value2"));
 data.add(Map.of("key11", "value11", "key22", "value22"));
 System.out.println(data);
 System.out.println("As iteration variable in enhanced for-loop");
 for ( var object : data){
 System.out.println(String.format("%s of type %s", object, object.getClass().getName()));
 }
 System.out.println("As looping index in for-loop");
 for ( var i = 0 ; i < data.size(); i++ ){
 var object = data.get(i);
 System.out.println(String.format("%s of type %s", object, object.getClass().getName()));
 }
 System.out.println("As a return value from another method");
 var anInteger = someAnotherMethod();
 System.out.println("someAnotherMethod returned " + anInteger);
 }
 //在方法的返回值中
 public static Integer someAnotherMethod(){
 System.out.println("someAnotherMethod called");
 var returnObj = 12;
 return returnObj;
 }
}

我们不能在什么地方使用?

我来创建另一个代码案例,来演示var不能在什么地方使用:

public class IllegalLocalVarInferenceDemo{
 //不能在申明类的成员变量的时候
 //var someProperty;
 //不允许作为类的构造方法参数的时候
 // public LocalVarInferenceDemo(var param1){
 // }
 public static void main(String[] args){
 //不允许作为catch的异常类型
 // try{
 // //some operations
 // }catch(var ex){
 // }
 }
 //不允许作为方法的参数类型声明
 //public static void someMethod(var param1, var param2){
 // System.out.println("Some method called");
 //}
 //不允许作为方法返回值类型声明
 // public static var someAnotherMethod2(){
 // System.out.println("someAnotherMethod called");
 // var returnObj = 12;
 // return returnObj;
 // }
}

以上就是动力节点java培训机构的小编针对“编程技术分享:Java10局部变量类型推断”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。

选你想看

你适合学Java吗?4大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交