模式匹配 instanceof

7

我在https://www.baeldung.com/java-pattern-matching-instanceof上看到了这个令人惊奇的主题。但是当我尝试运行以下代码时,它会抛出编译时错误:

if(obj instanceof String s) {
    System.out.println(s);
}

错误提示信息如下:

错误提示:

'instanceof' 中的模式在语言级别 '14' 不受支持

错误:(36, 34) java: instanceof 中的模式匹配是一项预览功能,并且默认情况下已被禁用。 (使用 --enable-preview 启用 instanceof 中的模式匹配)

但我已经安装了 Java 14。


请编辑您的问题。包括编译时错误的完整信息以及您对其不理解的部分。将标题更改为反映实际问题,而不是所涉及的概念(可以作为标签添加)。 - Sotirios Delimanolis
请包含完整的错误信息。假设您正在Intellij中编译此代码,消息将在“快速修复”子选项卡和“构建”窗口中继续显示。如果您不是在Intellij中编译,请包括您从javac中看到的完整错误消息或在Eclipse(或其他编译器)中看到的完整错误消息。 - Sotirios Delimanolis
我从未编译过它,否则我就会知道实际原因了,哈哈。 - user13120093
2个回答

19
这是Java 14中的一个预览功能,详见JEP 305JEP 375。要启用此功能,请使用以下命令编译您的类:
javac MainClass.java --enable-preview --release 14

现在你可以做的是:
java MainClass --enable-preview

instanceof的示例:

Object o = "Hello World!";
if (o instanceof String s) {
    // no explicit type casting
    s = s.replaceFirst("World", "Java"); // No compile time issues
    System.out.println(s);
}

从JEP复制的另一个例子:

if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}

更新

自从Java 16开始,"Pattern Matching for instanceof"已经是一个完全定稿的功能(即不再是预览版)。因此,在使用Java 16或更新版本时,无需单独启用此功能,它将默认启用。

详细信息请参阅JEP-394


2
我觉得你是不是想说_"当使用Java 16或者更新版本时,就不需要..."_ 而不是 "当使用Java 16或者旧版本时,就不需要..." 对吗? - skomisa

4

该功能已在Java 16中完成(JEP 394)。 对于以下版本,请参考此链接以从IntelliJ、Eclipse和STS等IDE中启用此预览功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接