运行时期间构造函数的数量和java.math.BigDecimal的编译时间不匹配

时间:2013-01-23 09:25:29

标签: java exception groovy runtime-compilation

我使用以下实现定义了一个名为BigDecimalWithAttrDisplay的新类:

class BigDecimalWithAttrDisplay extends BigDecimal{
    String display;
    BigDecimalWithAttrDisplay(String val){super(val)}
    public String toString(){
        "BigDecimalWithAttrDisplay{val=${super.toString()}, display='$display'}";
    }
}

尝试运行使用此类的代码时,我得到:

java.lang.IncompatibleClassChangeError: the number of constructors during runtime and compile time for java.math.BigDecimal do not match. Expected 17 but got 18
at groovy.lang.MetaClassImpl.selectConstructorAndTransformArguments(MetaClassImpl.java:1381)
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.selectConstructorAndTransformArguments(ScriptBytecodeAdapter.java:234)
at com.e4x.auto.services.checkout.testapi.model.response.BigDecimalWithAttrDisplay.<init>(BigDecimalWithAttrDisplay.groovy:31)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:77)
at org.codehaus.groovy.reflection.CachedConstructor.doConstructorInvoke(CachedConstructor.java:71)
at org.codehaus.groovy.runtime.callsite.ConstructorSite.callConstructor(ConstructorSite.java:42)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:194)

问题是什么?我该如何解决?

3 个答案:

答案 0 :(得分:5)

尝试清理已创建的类(对项目进行全新的重建)。你可能有以前编辑的文物。

另一种可能性是您使用的Java 7和Groovy代码使用低于7的版本编译。然后您可能还会遇到问题。 (例如参见:Geb - IncompatibleClassChangeError

答案 1 :(得分:1)

无法在2.0.5中重现您的错误,但如果问题是缺少构造函数,Groovy会有一个名为@InheritConstructors的注释,这可能有所帮助。

另请查看@Delegate。它可能比继承更酷。

答案 2 :(得分:0)

通过在构造函数中添加super(val)来添加对BigDecimal构造函数的调用。