2

我使用以下实现定义了一个名为 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)

有什么问题,我该如何解决?

4

3 回答 3

5

尝试清理您创建的类(重新构建您的项目)。您可能有以前编译的工件。

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

于 2013-01-23T09:29:45.820 回答
1

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

也看看@Delegate。它可能比继承更酷。

于 2013-01-23T11:10:54.083 回答
0

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

于 2013-01-23T09:40:50.523 回答