Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
2.4.5
-
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.