Java(14 及以上)instanceof 转换为泛型(例如 List

2024-03-12

我正在使用 Jackson 反序列化 JSON 有效负载。我有一些字段可以是对象或对象数组。所以在我的Java代码中我声明

class Outer{
    private Object inner;
}

我知道内在可以是Map<String,String> or List<Map<String,String>>

因为我需要对这个内部对象做一些工作,所以我必须驻留在 if - 实例

if (inner instanceof List){
    List<Map<String,String>> innerAsList = (List<Map<String,String>>)inner;
    ...
}else if (inner instanceof Map){
    Map<String,String> innerAsMap = (Map<String,String>)inner;
    ...
}else{
    throw new IllegalArgumentException("List or Map only");
}

现在尝试使用“新”模式匹配instanceof无法编译(我使用的是启用预览的 JDK 17)

if (inner instanceof List<Map<String,String>> innerAsList){
    ...
}else if (inner instanceof Map<String,String> innerAsMap){
    ...
}else{
    throw new IllegalArgumentException("List or Map only");
}

编译失败

'Object' cannot be safely cast to 'List<String>'

使用通配符强制转换编译

if (inner instanceof List<?> innerAsList){
   ...
}else if (inner instanceof Map<?,?> innerAsMap){
  ...
}else{
   throw new IllegalArgumentException("List or Map only");
}

但我仍然需要转换为正确的泛型。

这可以以某种方式解决吗?它是否缺少功能?如果是,是否计划在未来版本中添加它?


instanceof 是运行时类型检查,但泛型在编译时使用类型擦除。 这就是为什么instanceof不允许用于但允许用于原始类型List。 您可以查看有关泛型不能使用instanceof的教程:https://www.tutorialspoint.com/java_generics/java_generics_no_instanceof.htm https://www.tutorialspoint.com/java_generics/java_generics_no_instanceof.htm

或者,我可以想到一些解决方案。

方法一:检查第一个列表项的类型。

if (inner instanceof List && !((List) inner).isEmpty() && ((List) inner).get(0) instanceof Map) {
    // You may continue to check map key and value if necessary.
} else if (inner instanceof Map) {
    // You may continue to check map key and value if necessary.
} else {
    throw new IllegalArgumentException("List or Map only");
}

方法 2:在 try catch 块中使用类型转换。

try {
    Map<String, String> map = (Map<String, String>) inner;
    Map.Entry<String, String> entry = map.entrySet().iterator().next();
    String key = entry.getKey();
    String value = entry.getValue();
    System.out.println(key + " " + value);
} catch (ClassCastException e) {
    System.out.println("Object is not Map<String, String>");
}

可以将方法2与方法1结合使用,在instanceof Map之后继续检查。

方法3:使用instanceof 的包装类。

class ListWrapper extends ArrayList<Map<String, String>> { 
    //...
}

这种方式需要你付出更多的努力来实现CRUD操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java(14 及以上)instanceof 转换为泛型(例如 List ) 的相关文章

  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 如何修复 JNLP 应用程序中的“缺少代码库、权限和应用程序名称清单属性”?

    随着最近的 Java 更新 许多人都遇到了缺少 Java Web Start 应用程序的问题Codebase Permissions and Application name体现属性 尽管有资源可以帮助您完成此任务 但我找不到任何资源综合的

随机推荐