Groovy 绑定:无法将具有类“custompackage.CustomClass”的对象强制转换为类“custompackage.CustomClass”

Dev*_* H. 5 groovy

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

Caught: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'custompackage.CustomClass@60099951' with class 'custompackage.CustomClass' to class 'custompackage.CustomClass'
Run Code Online (Sandbox Code Playgroud)

这是相关的代码:

// 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)
Run Code Online (Sandbox Code Playgroud)

上面运行的文件:

// CustomScript.groovy
import custompackage.CustomClass
CustomClass t 

if(!binding.variables.containsKey("test")){
    t = new CustomClass()
} else {        
    t = test
}
Run Code Online (Sandbox Code Playgroud)

CustomClass t为了在我的 IDE 中自动完成,我在开始时定义了。运行时,def t它工作正常。

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

错误发生在 t = test

为什么 Groovy 试图将相同类型的对象强制转换为它的类型,然后却失败了?是否有一个修复程序仍然可以让我保持静态类型t

谢谢!

Ema*_*ger 2

看来custompackage.CustomClassinController.groovy和 in 不一样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"
Run Code Online (Sandbox Code Playgroud)

当使用GroovyShell而不是GroovyScriptEnginein时Controller.groovy,我得到:

def a = CustomClass.class // Debugger: a={Class@1185} "class custompackage.CustomClass"
def b = test.class        // Debugger: b={Class@1185} "class custompackage.CustomClass"
Run Code Online (Sandbox Code Playgroud)

并且作业t = test没有错误。

Controller.groovy使用的文件如下GroovyShell所示:

// 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"))
Run Code Online (Sandbox Code Playgroud)

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