【问题标题】:Pattern Matching for instanceof throwing a confusing error on compilationinstanceof 的模式匹配在编译时抛出一个令人困惑的错误
【发布时间】:2023-01-02 11:03:29
【问题描述】:

我有 Java 19,我正在尝试对我创建的记录进行一些简单的模式匹配。但是,Java 给我一个非常混乱的编译错误。这是我能做的导致错误的最简单的例子。

public class ExpressionTypeIsASubsetOfPatternType
{

   public record Triple(int a, int b, int c) {}

   public static void main(String[] args)
   {

      System.out.println("Java Version = " + System.getProperty("java.version"));

      final Triple input = new Triple(1, 2, 3);

      if (input instanceof Triple t)
      {

         System.out.println("Made it here");

      }

   }

}

这是当我尝试运行/编译时它给我的错误。

$ java ExpressionTypeIsASubsetOfPatternType.java
ExpressionTypeIsASubsetOfPatternType.java:15: error: expression type Triple is a subtype of pattern type Triple
      if (input instanceof Triple t)
                ^
1 error
error: compilation failed

令人惊讶的是,谷歌搜索这个错误没有任何用处。我已经习惯了输入错误并立即看到问题。我想这是因为这个功能太新了。

无论如何,我能找到的最接近的东西是一个相关的bug,但绝对不是我正在处理的同一个问题。

最后,这里是关于我的java版本的相关信息。

$ java --version
openjdk 19 2022-09-20
OpenJDK Runtime Environment (build 19+36-2238)
OpenJDK 64-Bit Server VM (build 19+36-2238, mixed mode, sharing)
$ javac --version
javac 19

【问题讨论】:

    标签: java pattern-matching instanceof java-record


    【解决方案1】:

    Java 只是“很好”:它认识到测试将总是成功(因为已知 input 是 Triple,它已经是测试类型 Triple 的子类型),所以它会产生一个错误,告诉您您正在做一些无用的事情(带有迂回信息)。

    这与制作的想法相同

    void foo() {
      return;
      return; // error: unreachable statement
    }
    

    一个错误:有一段无用的代码可能表明(严重的)程序员错误,因此编译器迫使您重新考虑代码。

    【讨论】:

    • 这就说得通了。你的回答实际上让我去看了 JLS,我看到了支持你所说内容的证据。您能否编辑您的答案以包含以下信息?那我就接受了——docs.oracle.com/javase/specs/jls/se19/html/…
    • 具体来说,JLS 网站上的粗体部分是我的问题的确切答案和你的答案的证据
    【解决方案2】:

    看起来您正在尝试使用 Java 14 中引入的新 instanceof 模式匹配功能。

    错误信息表达式类型 Triple 是模式类型 Triple 的子类型表示左侧表达式的类型实例运算符是右侧模式类型的子类型实例操作员。

    在这种情况下,表达式的类型输入是三倍, 模式类型也是三倍,所以条件应该被评估为真的, 块内的代码应该被执行。

    看起来编译器没有识别这一点,并给你一个错误。

    此错误的一个可能原因是您使用的是旧版本的 Java 编译器,它不支持 instanceof 模式匹配功能。

    您可以通过运行以下命令来检查 Java 编译器的版本javac--版本命令。

    如果您使用的 Java 编译器版本早于 14,则需要将其更新到较新的版本才能使用 instanceof 模式匹配功能。

    【讨论】:

    • 这个答案(正如我现在正在阅读的那样)没有回答我的问题。它只是重复我的情况。
    • 此编辑也无济于事。我原来的帖子说我正在使用 Java 19。我根本没有编辑我的原始帖子。
    猜你喜欢
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多