Graeme Rocher created GROOVY-7971:
-------------------------------------

             Summary: @CS flow typing incorrectly casting to map at runtime
                 Key: GROOVY-7971
                 URL: https://issues.apache.org/jira/browse/GROOVY-7971
             Project: Groovy
          Issue Type: Bug
    Affects Versions: 2.4.7
            Reporter: Graeme Rocher


The following code:

{code}
import groovy.json.*
import groovy.transform.*

@CompileStatic
class Bar {
    private Writable renderTemplate(Object o, Map args) {
    
    }
    private boolean isSimpleType(Class type) {
        return type == String
    }
    def foo(Map map, Map arguments) {
    
        def writable = new Writable() {
            @Override
            Writer writeTo(Writer out) throws IOException {
                for(entry in map.entrySet()) {
                   def value = entry.value
                   if(isSimpleType(value.getClass()) || (value instanceof Map)) 
{
                        out.append(JsonOutput.toJson(value))
                    }
                }
                return out
            }
        }
    }
}

writable = new Bar().foo([one:'two'],[foo:'bar'])

sw = new StringWriter()
writable.writeTo(sw)
println sw
{code}

Fails with:

{code}
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast 
object 'two' with class 'java.lang.String' to class 'java.util.Map'
        at 
org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnSAM(DefaultTypeTransformation.java:405)
        at 
org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnNumber(DefaultTypeTransformation.java:319)
        at 
org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToType(DefaultTypeTransformation.java:232)
        
{code}

For some reason Groovy is attempting to cast value to Map when it isn't one.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to