Java10类型推导

引言

2018年3月20日,大家期待已久的Java 10发布了,Java 10推出很多新的特性,比如局部变量类型推导,应用类数据共享,并行全垃圾回收器G1等等,其中和我们开发者息息相关的就是局部变量类型推导,今天我们就来聊一聊Java 10的局部变量类型推导。

概念

所谓的局部变量类型推导其实就是通过增强java语言特性将类型推断扩展到局部变量,它引入了其他语言中很常见的“var”,其表现形式也类似于JavaScript的中的“var”,只要编译器可以推断此种类型,你就不再需要专门声明一个局部变量的类型。

应用场景

java 10的局部变量类型推导不是在所有的地方都可以使用的,java10规定:

  • 局部变量类型仅限于如下使用场景:

    • 局部变量初始化

    • 对于循环内部索引变量

    • 传统的用于循环声明变量

  • 局部变量类型推导它不能用于以下几个地方:

    • 方法参数

    • 构造函数参数

    • 方法返回类型

    • 类的字段

示例代码

1.在定义局部变量的时候使用

在定义局部变量时,使用VAR来定义。

 cnitcast演示 ; 
公共demo1的 { 公共静态无效字符串 [] ARGS){ VAR = 1 ; var message = “Hello itcast” ; 系统出去println“这是第” + number + “个消息:” + message); } }
  

       
           
          
        
    

运行效果如下:


分析

由上面的代码我们发现,在定义局部变量的时候我们使用了var来定义变量,并且不会出现编译错误,并且执行也没有任何的问题。查看.class文件我们会发现:


 cnitcast演示 ; 
进口的Javaio的PrintStream ; 公共demo1的 { 公共demo1的()    {     } 公共静态无效字符串ARGS [])    { INT = 1 ; String message = “Hello itcast” ; 系统出去的println
 

  


     



        

           
           
        (( 的StringBuilder“\ u8FD9 \ u662F \ u7B2C” ))
                           。
 追加号码                           。附加“\ u4E2A \ u6D88 \ u606F:” )
                            。
 追加消息的toString());     } 
}

虽然在定义局部变量的时候我们使用了无功来定义,但是将java的文件转化成的.class文件的时候,会根据变量的值的具体类型推导出变量的类型,1是数字所以推导为了INT类型,” Hello itcast“是字符串所以推导为了String类型。

小结

通过上面的示例我们知道在定义局部变量的时候可以像javascript一样使用var来定义,在java文件转化成.class文件的时候会根据变量值的类型推导出变量的类型。

2.对于循环内部索引变量和内部设置变量时使用

在进行了循环的时候,内部的索引变量可以使用VAR来定义。


 cnitcast演示 ; 
公共DEMO2 { 公共静态无效字符串 [] ARGS){ VAR 的MSG = 字符串 [] { “itcast” “itheima” }; VAR = 0 ; < 封邮件长度 ; ++){ VAR STR = “你好!” ;
  

       
            
             
             
            系统出去printlnstr + msgs [ i ]); 
} } }        
    

运行效果如下:


小结

通过上面的示例我们发现var也可以用在for循环内部定义索引变量时使用,通过也可以在内部定义局部变量时使用。

3.var不能定义方法的参数的类型

在定义方法的时候,VAR是不能作为方法的参数类型来使用。


 cnitcast演示 ; 
公共Demo3 { 公共无效VAR 消息){ 系统出去println消息); } }
  
    
       
        
    
    

如上所示,在方法中使用VAR来定义参数的类型的时候,是直接会报编译错误。

4.var不能定义构造函数的参数的类型


 cnitcast演示 ; 
公共Demo4 { 公共Demo4VAR 消息){ } }
  
    
      
        
    

如上所示,在方法中使用VAR来定义构造函数的参数的类型的时候,是直接会报编译错误。

5.var不能作为方法的返回值的类型


 cnitcast演示 ; 
公共Demo5 { 公共变种(){ 回报“你好itcast” ; } }
  
    
      
         
    
    

如上所示,当VAR作为方法的返回值的类型的时候,是直接会报编译错误。

5.var不能用来定义类的字段的类型


 cnitcast演示 ; 
公共Demo6 { 公共变种ID ; private var name = “张三” ; private var password = 123456 ; }
  
    
      
      
      
    

如上所示,当使用VAR来定义类的字段的类型的时候,是直接会报编译错误。

小结

通过上面的示例我们发现当使用var作为方法参数,方法返回值类型,声明定义字段等的时候直接会报出编译错误,也就表示var在定义变量的时候并不是万能的。

总结

局部变量类型推导是java10推出的新特性之一,通过示例我们发现在处理时,编译器先是查看表达式右边部分,并将它作为变量的类型,然后将该类型写入字节码当中,但是局部变量类型推导现在还不完善,只能在特定的场景下才能使用,不能兼容所有的场景,虽然如此,但是它避免了信息冗余,而且对齐了变量名,更容易阅读。

展开阅读全文

没有更多推荐了,返回首页