当前位置: 首页 > 知识库问答 >
问题:

instanceof中的模式匹配有时不能解决理论上可解决的范围

暨承平
2023-03-14
import org.w3c.dom.Comment;
import org.w3c.dom.Document;
import org.w3c.dom.Node;

List<Node> list = new ArrayList<>();
Node x = list.get(0);
if (!(x instanceof Comment comment)) {
    if (!(x instanceof Document doc && doc.getFirstChild() instanceof Comment comment)) {
        return null;
    }
}
System.out.println(comment.ToString()); // cannot resolve comment

变量comment无法解析,但它应该解析--我们讨论了两个互斥的快乐路径,每个路径都分配comment comment-system out应该能够看到comment,否则将触发return null

共有1个答案

穆鸿卓
2023-03-14

不能使用模式匹配在两个不同的地方声明同一个变量。它们仍然是两个不同的变量,具有两个不同的作用域。

也许,我们可以通过给它们起不同的名字来清除混乱:

if (!(x instanceof Comment comment)) {
    if (!(x instanceof Document doc && doc.getFirstChild() instanceof Comment comment2)) {
        return null;
    }
    //comment2 and doc are in scope here,
    //but their scope ends with an enclosing block
    System.out.println(comment2.toString());
}
//FAIL! You can't access comment2 outside its scope
System.out.println(comment2.toString()); 
//FAIL! You can't access comment here because 
//the compiler can't guarantee that the block above exited.
System.out.prinltn(comment.toString()

您可以使用如下简单示例来验证模式匹配变量是否仍保留在其封闭范围内:

{
    Object o = null;
    if(!(o instanceof String s)) {
          return;
    }
    System.out.println(s); //OK
}
System.out.println(s); //Doesn't work
Comment comment;
if (!(x instanceof Comment c)) {
    if (!(x instanceof Document doc && doc.getFirstChild() instanceof Comment c)) {
        return null;
    }
    comment = c;
} else {
    comment = c;
}
System.out.println(comment.toString());
private static Comment extractComment(Node x) {
    if (!(x instanceof Comment comment)) {
        if (!(x instanceof Document doc && doc.getFirstChild() instanceof Comment comment)) {
            return null;
        }
        return comment;
    } 
    return comment;
}

甚至:

private static Comment extractComment(Node x) {
    if (x instanceof Comment comment) {
        return comment;
    }     
    if (x instanceof Document doc && doc.getFirstChild() instanceof Comment comment) {
        return comment;
    }
    return null;
}
 类似资料:
  • 主要内容:Java16 instanceof的模式匹配的语法,Java16 instanceof的模式匹配示例Java 14 引入了 instanceof 运算符以将类型测试模式作为预览功能。类型测试模式有一个谓词来指定具有单个绑定变量的类型。它仍然是 Java 15 中的预览功能。在 Java 16 中,此功能现已成为标准交付的一部分。 Java16 instanceof的模式匹配的语法 Java16 instanceof的模式匹配示例 ApiTester.java 编译并运行程序 输出结果为

  • 主要内容:Java15 instanceof的模式匹配的语法,Java15 instanceof的模式匹配的示例Java 14 引入了 instanceof 运算符以将类型测试模式作为预览功能。类型测试模式有一个 predicate来指定具有单个绑定变量的类型。它仍然是 Java 15 中的预览功能。 Java15 instanceof的模式匹配的语法 Java15 instanceof的模式匹配的示例 ApiTester.java 编译并运行程序 输出结果为  

  • 主要内容:Java14 instanceof语法,Java14 instanceof的示例Java 14 引入了 instanceof 运算符以将类型测试模式作为预览功能。类型测试模式有一个predicate来指定具有单个绑定变量的类型。 Java14 instanceof语法 Java14 instanceof的示例 ApiTester.java 编译并运行程序 输出结果为  

  • 我在angular 5中实现了一个模式,在.ts文件中使用以下代码进行密码验证。这样做的目的是支持至少八个字符,至少一个大写字母、一个小写字母、一位数字和一个特殊字符。请参阅:密码的Regex必须包含至少八个字符、至少一个数字以及大小写字母和特殊字符 我明白了,当我在密码文本框中输入一个字符串时,例如< code>Niladri1!然而,当我输入一个类似于< code>Nopasss123!!,它

  • 本文向大家介绍Java正则表达式匹配不到结果的解决,包括了Java正则表达式匹配不到结果的解决的使用技巧和注意事项,需要的朋友参考一下 如下所示: str为要匹配的字符串(是传入的),regex为正则表达式 目的是匹配出<DetailInfo>标签中的内容 在本地测试时可以匹配出来,但是在线上就不行。 真的是百思不得其解…… 后来认真比对了一下线上传入的str和本地复制过来的str,发现了了一个微

  • 1. 前言 大家好,本小节,我们学习代理模式解决转账过程中产生的事务问题,如有中途而来的童鞋,请先移步上一小节学习下问题的场景。 2. 实战案例 2.1 实现思路介绍 1. 创建一个工具类,目的是用于管理数据库的事务,提供事务的开启,提交,回滚等操作; 2. 创建一个代理处理器类,目的是生成转账实现类的代理对象,对转账的业务方法提供增强,主要是在数据操作之前,和操作之后干点事,嘿嘿嘿; 3. 在