Dmitry created GROOVY-10903: ------------------------------- Summary: Cannot cast object 'A a' with class 'A' to class 'B'. Build file try to cast when use 'instanceof' and 'or' operator (||) in 'if' condition Key: GROOVY-10903 URL: https://issues.apache.org/jira/browse/GROOVY-10903 Project: Groovy Issue Type: Bug Components: Compiler, Static compilation Affects Versions: 3.0.11, 3.0.10 Reporter: Dmitry Attachments: ErrorWithCast.zip, TestJavaGroovyGradleProject-1.zip
Hi team! I have 2 classes: * Invoice extends AbstractInvoice * Quote extends AbstractInvoice And I try to run {code:java} AbstractInvoice abstractInvoice = new Invoice() if (abstractInvoice.newRecord || abstractInvoice instanceof Quote) { abstractInvoice.setContact(new Contact()) } {code} I get "Exception in thread "main" org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'groov.Invoice@3f2a3a5' with class 'groov.Invoice' to class 'groov.Quote'" I investigated build files and I saw this: {code:java} Invoice abstractInvoice = new Invoice(); Object var10000; if (((Invoice)abstractInvoice).isNewRecord() || abstractInvoice instanceof Quote) { ((Quote)ScriptBytecodeAdapter.castToType(abstractInvoice, Quote.class)).setContact(new Contact()); var10000 = null; } {code} Groovy sees 'abstractInvoice instanceof Quote' and tries to cast Class to Quote. But It forgets about || condition. In our project we use 2.5.15 version and we upgrading it to 4.0.2 version. After investigation I found that this behavior appeared in 3.0.11 version. 3.0.10 and older work correct. If I use Main Java class it works correct as well. I localized issue here (minimum classes and dependancies): [^ErrorWithCast.zip] Part from our project(more inheritance): [^TestJavaGroovyGradleProject 2.zip][^TestJavaGroovyGradleProject.zip] -- This message was sent by Atlassian Jira (v8.20.10#820010)