JDK10中的局部变量类型推断var

Java是一种强类型, 许多流行的编程语言都已经支持局部变量类型推断,如js,Python,C++等

JDK10 可以使用var作为局部变量类型推断标识符

Local-Variable Type Inference(局部变量量类型推断),顾名思义只能用做为局部变量

注意

仅适用于局部变量量,如 增强for循环的索引,传统for循环局部变量不能使用于方法形参、构造函数形参、方法返回类型或任何其他类型的变量量声明标识符var不是关键字,而是一个保留类型名称,而且不支持类或接口叫var,也不符合命名规范

用jshell试验或者IDEA

//根据推断为 字符串串类型
var strVar = "springboot";
System.out.println(strVar instanceof String);

//根据10L 推断long 类型
var longVar = 10 L;

//根据 true推断 boolean 类型
var flag = true;
//var flag = Boolean.valueOf("true");
//System.out.println(flag instanceof Boolean);

// 推断 ArrayList<String>
var listVar = new ArrayList < String > ();
System.out.println(listVar instanceof ArrayList);

// 推断 Stream<String>
var streamVar = Stream.of("aa", "bb", "cc");
System.out.println(streamVar instanceof Stream);
if (flag) {
  System.out.println("这个是 flag 变量量,值为true");
}
for (var i = 0; i < 10; i++) {
  System.out.println(i);
}
try (var input = new FileInputStream("validation.txt")) {}

附录:下面看下局部变量类型推断

很多人抱怨Java是一种强类型,需要引入大量的样板代码。甚至在这些情况下,给定好变量名,通常很清楚发生了什么,明显类型声明往往被认为是不必要的。许多流行的编程语言都已经支持某种形式的局部变量类型推断:如C++ (auto), C# (var), Scala (var/val), Go (declaration with :=)等。

JDK10 可以使用var作为局部变量类型推断标识符,此符号仅适用于局部变量,增强for循环的索引,以及传统for循环的本地变量;它不能使用于方法形式参数,构造函数形式参数,方法返回类型,字段,catch形式参数或任何其他类型的变量声明。

标识符var不是关键字;相反,它是一个保留的类型名称。这意味着var用作变量,方法名或则包名称的代码不会受到影响;但var不能作为类或则接口的名字(但这样命名是比较罕见的,因为他违反了通常的命名约定,类和接口首字母应该大写)。

参考一下示例:

var str = "ABC"; //根据推断为 字符串类型
var l = 10L;//根据10L 推断long 类型
var flag = true;//根据 true推断 boolean 类型
var flag1 = 1;//这里会推断boolean类型。0表示false 非0表示true
var list = new ArrayList<String>(); // 推断 ArrayList<String>
var stream = list.stream();     // 推断 Stream<String>

反编译class文件:

String str = "ABC";
long l = 10L;
boolean flag = true;
int flag1 = true;
ArrayList<String> list = new ArrayList();
Stream<String> stream = list.stream();

从上面示例可以看出,当我们是用复杂的方法时,不需要特意去指定他的具体类型返回,可以使用var推断出正确的数据类型,这在编码中,可以大幅减少我们对方法返回值的探究。

到此这篇关于JDK10中的局部变量类型推断var的文章就介绍到这了,更多相关JDK10局部变量类型推断var内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JDK10新特性之本地变量类型var的深入理解

    简介 java以面向对象的特性显著于世并得到了蓬勃的发展.在语言的发展过程中,为了让java语言更加简洁和方便使用,JDK也在不断的进行改进. 今天本文将要介绍一下JDK10中引入的本地变量类型var. 为什么我们需要var 类型推断是很多编程语言都具有的特性,编译器可以在我们不指定具体变量类型的情况下推断出该变量的实际类型. 类型推断的出现,可以让程序员的代码更加灵活,利于维护和编写.其实我们一直都有使用到类型推断. JDK8中引入的lambda表达式就是类型推断的一个非常有用的例子: int

  • JDK10新特性之var泛型和多个接口实现方法

    简介 在JDK10的新特性:本地变量类型var中我们讲到了为什么使用var和怎么使用var. 今天我们来深入的考虑一下var和泛型,多个接口实现的问题. 实现多个接口 在JDK的实现和我们日常的工作中,很多时候都需要实现多个接口,我们举常用的两个例子ArrayList和CopyOnWriteArrayList.先看下他们的定义: public class ArrayList<E> extends AbstractList<E> implements List<E>, R

  • JDK10中的局部变量类型推断var

    Java是一种强类型, 许多流行的编程语言都已经支持局部变量类型推断,如js,Python,C++等 JDK10 可以使用var作为局部变量类型推断标识符 Local-Variable Type Inference(局部变量量类型推断),顾名思义只能用做为局部变量 注意 仅适用于局部变量量,如 增强for循环的索引,传统for循环局部变量不能使用于方法形参.构造函数形参.方法返回类型或任何其他类型的变量量声明标识符var不是关键字,而是一个保留类型名称,而且不支持类或接口叫var,也不符合命名规

  • Java 10 局部变量类型推断浅析

    前言 java 10 引进一种新的闪闪发光的特性叫做局部变量类型推断.听起来很高大上吧?它是什么呢? 下面的两个情景是我们作为 Java 开发者认为 Java 比较难使用的地方. 上下文:陈词滥调和代码可读性 也许日复一日,你希望不再需要重复做一些事情.例如在下面的代码(使用 Java 9 的集合工厂),左边的类型也许会感觉到冗余和平淡. import static java.util.Map.entry; List<String> cities = List.of("Brussel

  • javascript中对变量类型的判断方法

    在JavaScript中,有5种基本数据类型和1种复杂数据类型,基本数据类型有:Undefined, Null, Boolean, Number和String:复杂数据类型是Object,Object中还细分了很多具体的类型,比如:Array, Function, Date等等.今天我们就来探讨一下,使用什么方法判断一个出一个变量的类型. 在讲解各种方法之前,我们首先定义出几个测试变量,看看后面的方法究竟能把变量的类型解析成什么样子,以下几个变量差不多包含了我们在实际编码中常用的类型. var

  • 浅谈C#中的常量、类型推断和作用域

    一.常量常量是其值在使用过程中不会发生变化的变量.在声明和初始化变量时,在变量前面家关键字const,就可以把该变量指定为一个常量: const int a=100;//a的值将不可以改变 常量的特征: 1.常量必须在声明时初始化.指定了其值以后,就不能再修改了.2.常量的值必须能在编译时用于计算.因此不能从一个变量中提取的值来初始化常量.如果需要这么做,应该使用只读字段.3.常量总是静态的,但注意,不必在常量的声明中包含修饰符static.(实际上,不允许)在程序中使用常量至少有3个好处: 1

  • Java8中对泛型目标类型推断方法的改进

    一.简单理解泛型 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.通俗点将就是"类型的变量".这种类型变量可以用在类.接口和方法的创建中. 理解Java泛型最简单的方法是把它看成一种便捷语法,能节省你某些Java类型转换(casting)上的操作: 复制代码 代码如下: List<Apple> box = new ArrayList<Apple>();box.add(new Apple());Apple a

  • TS 中的类型推断与放宽实例详解

    目录 简介 类型推断与放宽概念 常规类型推断 最佳通用类型 按上下文归类 类型放宽 常规类型放宽 非严格类型检查模式 严格类型检查模式 字面量类型放宽 对象.数组字面量类型的放宽 类字面量类型的放宽 函数返回值字面量类型的放宽 TS 内部类型放宽规则 实例分析 开篇问题解答 简介 我们知道在编码时即使不标注变量类型,TypeScript 编译器也能推断出变量类型,那 TypeScript 编译器是怎么进行类型推断,在类型推断时又是如何判断兼容性的呢? 此文,正好为你解开这个疑惑的,掌握本文讲解的

  • 详解TypeScript映射类型和更好的字面量类型推断

    概述 TypeScript 2.1 引入了映射类型,这是对类型系统的一个强大的补充.本质上,映射类型允许w咱们通过映射属性类型从现有类型创建新类型.根据咱们指定的规则转换现有类型的每个属性.转换后的属性组成新的类型. 使用映射类型,可以捕获类型系统中类似Object.freeze()等方法的效果.冻结对象后,就不能再添加.更改或删除其中的属性.来看看如何在不使用映射类型的情况下在类型系统中对其进行编码: interface Point { x: number; y: number; } inte

  • Java8新特性之泛型的目标类型推断_动力节点Java学院整理

    简单理解泛型 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.通俗点将就是"类型的变量".这种类型变量可以用在类.接口和方法的创建中. 理解Java泛型最简单的方法是把它看成一种便捷语法,能节省你某些Java类型转换(casting)上的操作: List<Apple> box = new ArrayList<Apple>(); box.add(new Apple());Apple apple =box.ge

  • 关于Golang变量初始化/类型推断/短声明的问题

    视频: https://www.bilibili.com/video/BV1Zh411k7iB/ 声明变量同时初始化 上节我们了解了三种变量声明的语法,并且知道未初始化的变量初始值都是其类型的零值 其实只需要在声明时赋予初始值,即可进行初始化 下面针对三种变量声明语法进行初始化: [1] var name type [2] var name1, name2 type [3] var ( name1 type1 name2 type2 ) 类型推断 如果变量声明时附带初始值,Go会自动推断出初始值

  • golang类型推断与隐式类型转换

    目录 前言 一.常量的隐式类型转换 1.常量的声明 2.常量的类型转换 3.隐式转换的原理 二.变量的类型推断 1.类型推断的原理 三.类型推断示例分析 总结 前言 golang类型推断可以省略类型,像写动态语言代码一样,让编程变得更加简单,同时也保留了静态类型的安全性. 类型推断往往也伴随着类型的隐式转换,二者均与golang的编译器有关.在了解了golang的类型推断与隐式类型转换原理后,将对如下问题信手拈来——下述代码能通过编译吗?b的值是什么类型? // eg.1 a := 1.1 b

随机推荐