Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8301025

ClassCastException in switch with generic record

XMLWordPrintable

    • b09

      The following code throws a ClassCastException in JDK21 b6 but compiles with the latest JDK20:

      record TestRecord<T extends String>(T t) {}

          public static void main(String argv[]) {

              TestRecord r = new TestRecord("a");
              switch (r) {
                  case TestRecord(String cS)-> {
                      System.out.println("String");
                  }
                  case TestRecord(Object cO)->{
                      System.out.println("Object");
                  }
              }
          }

      Exception:
      An exception has occurred in the compiler (21-ea). Please file a bug against the Java compiler via the Java bug reporting page (https://bugreport.java.com) after checking the Bug Database (https://bugs.java.com) for duplicates. Include your program, the following diagnostic, and the parameters passed to the Java compiler in your report. Thank you.
      java.lang.ClassCastException: class com.sun.tools.javac.code.Type$TypeVar cannot be cast to class com.sun.tools.javac.jvm.PoolConstant$LoadableConstant (com.sun.tools.javac.code.Type$TypeVar and com.sun.tools.javac.jvm.PoolConstant$LoadableConstant are in module jdk.compiler of loader 'app')
             at jdk.compiler/com.sun.tools.javac.comp.TransPatterns.toLoadableConstant(TransPatterns.java:836)
             at jdk.compiler/com.sun.tools.javac.comp.TransPatterns.lambda$handleSwitch$4(TransPatterns.java:485)
             at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
             at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
             at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1921)
             at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
             at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:276)
             at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
             at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1921)
             at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
             at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
             at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:575)
             at java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260)
             at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:616)
             at jdk.compiler/com.sun.tools.javac.comp.TransPatterns.handleSwitch(TransPatterns.java:487)
             at jdk.compiler/com.sun.tools.javac.comp.TransPatterns.visitSwitch(TransPatterns.java:372)
             at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCSwitch.accept(JCTree.java:1305)
             at jdk.compiler/com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
             at jdk.compiler/com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:70)
             at jdk.compiler/com.sun.tools.javac.comp.TransPatterns.handleSwitch(TransPatterns.java:551)
             at jdk.compiler/com.sun.tools.javac.comp.TransPatterns.visitSwitch(TransPatterns.java:372)
             at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCSwitch.accept(JCTree.java:1305)
             at jdk.compiler/com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
             at jdk.compiler/com.sun.tools.javac.comp.TransPatterns.visitBlock(TransPatterns.java:1068)
             at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1088)
             at jdk.compiler/com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
             at jdk.compiler/com.sun.tools.javac.tree.TreeTranslator.visitMethodDef(TreeTranslator.java:150)
             at jdk.compiler/com.sun.tools.javac.comp.TransPatterns.visitMethodDef(TransPatterns.java:1005)
             at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:912)
             at jdk.compiler/com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
             at jdk.compiler/com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:70)
             at jdk.compiler/com.sun.tools.javac.tree.TreeTranslator.visitClassDef(TreeTranslator.java:139)
             at jdk.compiler/com.sun.tools.javac.comp.TransPatterns.visitClassDef(TransPatterns.java:1134)
             at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:810)
             at jdk.compiler/com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
             at jdk.compiler/com.sun.tools.javac.comp.TransPatterns.translateTopLevelClass(TransPatterns.java:1208)
             at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.desugar(JavaCompiler.java:1600)
             at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.desugar(JavaCompiler.java:1443)
             at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:963)
             at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.lambda$doCall$0(JavacTaskImpl.java:104)
             at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.invocationHelper(JavacTaskImpl.java:152)
             at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:100)
             at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:94)
             at jdk.compiler/com.sun.tools.javac.launcher.Main.compile(Main.java:399)
             at jdk.compiler/com.sun.tools.javac.launcher.Main.run(Main.java:202)
             at jdk.compiler/com.sun.tools.javac.launcher.Main.main(Main.java:132)

      JDK:
      java 21-ea 2023-09-19 LTS
      Java(TM) SE Runtime Environment (build 21-ea+6-LTS-365)
      Java HotSpot(TM) 64-Bit Server VM (build 21-ea+6-LTS-365, mixed mode, sharing)

      If run in JDK20, the code above prints “String” as I would expect.
      Both r instanceof TestRecord(Object cS) and r instanceof TestRecord(String cS) return true in JDK21.

            abimpoudis Angelos Bimpoudis
            eananeva Ella Ananeva
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved: