org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '1975/10/29' with class 'java.lang.String' to class 'java.lang.Number'

Apache's JIRA Issue Tracker | Aaron Zeckoski | 8 years ago
Click on the to mark the solution that helps you, Samebug will learn from it.
As a community member, you’ll be rewarded for you help.
  1. 0

    It does not seem possible to overload a setter with multiple methods. Groovy seems to randomly decide to fail with cast exceptions rather than actually calling the correct setter. Here is the code: public class Person { // id is added by grails String name String email Date birthdate int age = 0 PersonSex sex = PersonSex.unknown boolean active = true void setBirthdate(String date) { // try to convert from string def df = new SimpleDateFormat("yyyy/MM/dd") birthdate = df.parse(date); } void setBirthdate(Number date) { birthdate = new Date(date) } } I have a few tests to verify that I can create a user with a Date, String, or Long With the code above it is not possible to set the bithdate to a Date anymore as I always get a cast exception. If I change "Number" to "Long" or "long" then the String test passes but the number test fails. If I leave it as shown above then the String test fails with this exception: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '1975/10/29' with class 'java.lang.String' to class 'java.lang.Number' at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToNumber( at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToType( at groovy.lang.MetaClassImpl.setProperty( at groovy.lang.MetaClassImpl.setProperty( at groovy.lang.MetaClassImpl.setProperties( at groovy.lang.MetaClassImpl.invokeConstructor( at groovy.lang.MetaClassImpl.invokeConstructor( at org.codehaus.groovy.runtime.InvokerHelper.invokeConstructorOf( at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeNewN( at PersonTest.testPersonStringDate(PersonTests.groovy:32) It seems like groovy is only able to work with a single setter method but it should be able to handle overloaded methods and properly call the one which matches the type.

    Apache's JIRA Issue Tracker | 8 years ago | Aaron Zeckoski
    org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '1975/10/29' with class 'java.lang.String' to class 'java.lang.Number'

    Root Cause Analysis

    1. org.codehaus.groovy.runtime.typehandling.GroovyCastException

      Cannot cast object '1975/10/29' with class 'java.lang.String' to class 'java.lang.Number'

      at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToNumber()
    2. Groovy
      1. org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToNumber(
      2. org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToType(
      3. groovy.lang.MetaClassImpl.setProperty(
      4. groovy.lang.MetaClassImpl.setProperty(
      5. groovy.lang.MetaClassImpl.setProperties(
      6. groovy.lang.MetaClassImpl.invokeConstructor(
      7. groovy.lang.MetaClassImpl.invokeConstructor(
      8. org.codehaus.groovy.runtime.InvokerHelper.invokeConstructorOf(
      9. org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeNewN(
      9 frames
    3. Unknown
      1. PersonTest.testPersonStringDate(PersonTests.groovy:32)
      1 frame