Uploaded image for project: 'Groovy'
  1. Groovy
  2. GROOVY-7758

GroovyCastException when both @CompileStatic and @Newify are used

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 2.4.5
    • Fix Version/s: 2.4.7
    • Component/s: Static compilation
    • Labels:
      None

      Description

      The following code gives GroovyCastException.

      class Main {
        public static void main(String... args) {
          Test test = new Test()
        }
      }
      
      @CompileStatic @Newify
      class Test {
        private HashMap<String, A> hashMap = [:]
        public Test() {
          set()
          test()
        }
        public void test() {
          hashMap.each() { String string, A a ->
            a.printString()
          }
        }
        public void set() {
          hashMap.put("aaa", B.new("xxx"))
          hashMap.put("bbb", B.new("yyy"))
        }
      }
      
      class A {
        public String string = ""
        public void printString() {
          println(string)
        }
      }
      
      class B extends A {
        public B(String string) {
          this.string = string
        }
      }
      

      The code below is a part of the decompiled Test.class. Groovy tries to cast this instead of a.

      public Object doCall(String string, A a) {
        ((A)ScriptBytecodeAdapter.castToType(((_test_closure1)this).getThisObject(), A.class)).printString();
        return null;
      }
      

      When @CompileStatic is omitted, or when @Newify is omitted and B.new is replaced by new B, the code above gives no exception and runs as expected.

        Attachments

          Activity

            People

            • Assignee:
              shils Shil Sinha
              Reporter:
              Ziphil Natsuki Takanashi
            • Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: