Java 16 新玩法:instanceof 升级版,让类型检查更精准

简介: Java 16 新玩法:instanceof 升级版,让类型检查更精准

instanceof 这个关键词,主要用来判断某个对象是不是某个类的实例。

比如,有时候我们要处理一个类似这样的数据集

Map<String, Object> data = new HashMap<>();
data.put("key1", "aaa");
data.put("key2", 111);

这个 Map 中的 Value 值因为可能是不同的对象,所以定义的是 Object。这个时候,当我们 get 出来的时候,就需要去判断和转换之后再去处理。

比如,我们取出 key1value,然后截取一段字符串的操作,就需要这样写:

Object value = data.get("key1");
if (value instanceof String) {
  String s = (String) value;
  System.out.println(s.substring(1));
}

先判断获取的 value 是否是 String,再做强制类型转换,然后再对字符串进行操作。这是传统的写法,而在 Java 16 的增强之后,对于 instanceof 的判断以及类型转换可以合二为一了,所以改进后的写法可以如下:

Object value = data.get("key1");
if (value instanceof String s) {
  System.out.println(s.substring(1));
}

是不是简单不少呢?如果没用过的话,赶紧操作试试看吧!

Tips:该功能经历了 2 个 Preview 版本(JDK 14 中的 JEP 305、JDK 15 中的 JEP 375),最终定稿于 JDK 16 中的 JEP 394。

相关文章
|
14天前
|
Java 编译器
Java一分钟之——异常分类:检查异常与运行时异常
【5月更文挑战第20天】Java异常处理分为检查异常(Checked Exceptions)和运行时异常(Unchecked Exceptions),两者在编译期处理方式不同。检查异常需捕获或声明,如`IOException`,而运行时异常如`NullPointerException`在运行时终止程序。常见问题包括不恰当的异常使用、过度捕获和忽略异常信息。避免策略包括正确区分异常类型、具体捕获和处理异常信息。示例代码展示了如何处理这两种类型的异常。理解并妥善处理异常能提升程序的健壮性和可维护性。
44 4
|
14天前
|
存储 安全 Java
Java一分钟之-泛型擦除与类型安全
【5月更文挑战第20天】Java泛型采用类型擦除机制,在编译期间移除泛型信息,但在编译阶段提供类型安全检查。尽管需要类型转换且可能产生警告,但可以通过特定语法避免。使用泛型时应注意自动装箱拆箱影响性能,无界通配符仅允许读取。理解这些特性有助于编写更安全的代码。
42 4
|
19天前
|
Java 索引
【JAVA基础篇教学】第七篇:Java异常类型说明
【JAVA基础篇教学】第七篇:Java异常类型说明
|
5天前
|
Java
深入理解Java中的instanceof运算符
深入理解Java中的instanceof运算符
|
7天前
|
安全 算法 Java
Java多线程基础-15:Java 中 synchronized 的优化操作 -- 锁升级、锁消除、锁粗化
`synchronized`在Java并发编程中具有以下特性:开始时是乐观锁,竞争激烈时转为悲观锁;从轻量级锁升级至重量级锁;常使用自旋锁策略;是不公平且可重入的;不支持读写锁。
20 0
|
7天前
|
Java
Java初识泛型 | 如何通过泛型类/泛型方法获取任意类型的三个数的最大值?
本文介绍了如何使用Java中的泛型来实现一个可以比较任意数值类型最大值的功能。。
21 2
|
11天前
|
存储 Java 编译器
Java泛型类型擦除以及类型擦除带来的问题
Java中的泛型是伪泛型,编译时泛型信息会被擦除,例如ListString和ListInteger在JVM中都变为List。泛型擦除后,类型检查主要在编译时完成,针对的是引用而非实际对象。例如,ArrayListString的原始类型是ArrayList,但编译时会对引用调用的方法进行类型检查。类型转换由编译器自动处理,如PairDate的value在访问时会自动转换为`Date`。泛型不能用于基本类型,如ArrayListdouble应写作ArrayListDouble。静态方法和静态类不能使用泛型类的类型参数,但可以定义泛型静态方法。
142 0
|
15天前
|
安全 Java API
Java一分钟之-泛型通配符:上限与下限野蛮类型
【5月更文挑战第19天】Java中的泛型通配符用于增强方法参数和变量的灵活性。通配符上限`? extends T`允许读取`T`或其子类型的列表,而通配符下限`? super T`允许向`T`或其父类型的列表写入。野蛮类型不指定泛型,可能引发运行时异常。注意,不能创建泛型通配符实例,也无法同时指定上下限。理解和适度使用这些概念能提升代码的通用性和安全性,但也需兼顾可读性。
36 3
|
18天前
|
Java Kotlin
关于Java:public函数公开其public / * package * /’参数类型
关于Java:public函数公开其public / * package * /’参数类型
17 3
|
19天前
|
Java 编译器 C语言
【Java开发指南 | 第五篇】Java变量类型、参数变量及局部变量
【Java开发指南 | 第五篇】Java变量类型、参数变量及局部变量
21 3