Groovy绑定:无法将类'custompackage.CustomClass'的对象强制转换为类'custompackage.CustomClass'

时间:2015-12-03 14:09:49

标签: groovy

使用Groovy Binding从主控制器执行脚本并尝试传递自定义对象,我收到标题中提到的错误。

Caught: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'custompackage.CustomClass@60099951' with class 'custompackage.CustomClass' to class 'custompackage.CustomClass'

以下是相关代码:

// Controller.groovy
import custompackage.CustomClass
CustomClass test = new CustomClass()

def binding = new Binding()
def engine = new GroovyScriptEngine('./src')

binding.setProperty("test", test)

engine.run("CustomScript.groovy", binding)

上面运行的文件:

// CustomScript.groovy
import custompackage.CustomClass
CustomClass t 

if(!binding.variables.containsKey("test")){
    t = new CustomClass()
} else {        
    t = test
}

我在开头定义CustomClass t以便在IDE中自动完成。以def t运行时效果很好。

由于异常(以及对象的进一步打印),我知道对象正在正确传递

错误发生在t = test

为什么Groovy试图将类型相同的对象转换为它的类型,然后没有这样做?是否有一个修复程序仍然允许我保留静态类型t

谢谢!

1 个答案:

答案 0 :(得分:2)

custompackage.CustomClass中的Controller.groovy似乎与CustomScript.groovy中的CustomScript.groovy不同。

我使用调试器检查了def a = CustomClass.class // Debugger: a={Class@1499} "class custompackage.CustomClass" def b = test.class // Debugger: b={Class@1187} "class custompackage.CustomClass" 中的类实例,发现了一些有趣的东西:

GroovyShell

GroovyScriptEngine中使用Controller.groovy代替def a = CustomClass.class // Debugger: a={Class@1185} "class custompackage.CustomClass" def b = test.class // Debugger: b={Class@1185} "class custompackage.CustomClass" 时,我得到了:

t = test

并且作业Controller.groovy可以正常运行。

使用GroovyShell的{​​{1}}文件如下所示:

// Controller.groovy
import custompackage.CustomClass
CustomClass test = new CustomClass()

def binding = new Binding()
def shell = new GroovyShell(binding)

binding.setProperty("test", test)

shell.evaluate(new File("CustomScript.groovy"))

我查看了GroovyScriptEngine的文档,发现了一个以ClassLoader为参数的构造函数。也许这是要走的路,但我不确定。

相关问题