我使用以下实现定义了一个名为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)
问题是什么?我该如何解决?
答案 0 :(得分:5)
尝试清理已创建的类(对项目进行全新的重建)。你可能有以前编辑的文物。
另一种可能性是您使用的Java 7和Groovy代码使用低于7的版本编译。然后您可能还会遇到问题。 (例如参见:Geb - IncompatibleClassChangeError)
答案 1 :(得分:1)
无法在2.0.5中重现您的错误,但如果问题是缺少构造函数,Groovy会有一个名为@InheritConstructors的注释,这可能有所帮助。
另请查看@Delegate。它可能比继承更酷。
答案 2 :(得分:0)
通过在构造函数中添加super(val)来添加对BigDecimal构造函数的调用。