Groovy - 脚本中的类型检查不按预期工作

时间:2015-11-23 00:03:17

标签: groovy type-conversion typechecking

我有一个Groovy应用程序,我允许用户通过Groovy脚本添加自定义行为。我通过GroovyShell添加了这些脚本,并通过Type Checking Extensions输入。我在应用程序中包含脚本的完整代码是:

def config = new CompilerConfiguration()
config.addCompilationCustomizers(
    new ASTTransformationCustomizer(TypeChecked)
)
def shell = new GroovyShell(config)
shell.evaluate(new File("path/to/some/file.groovy"))

这很好用。 然而,脚本中的类型检查似乎严重受损。例如,我可以包含以下脚本,不带来自编译器的任何投诉:

String test = getTestValue() // automatic conversion from Integer to String. But WHY?
println "The value is $test" // shows as "The value is 0" on the console

private Integer getTestValue(){
    return 0
}

我甚至可以走得更远。在脚本中创建class时,我可以将其分配给String而不会出现任何错误:

String y = new Test()
println y // shows Test@somenr on the console

class Test { }

其他类型检查执行工作。我还没有发现它背后的任何逻辑,所以非常感谢任何指向正确方向的指针。

2 个答案:

答案 0 :(得分:1)

如果有疑问,请解除。这与您的呼叫类似:String x = new T()

   0: invokestatic  #17                 // Method $getCallSiteArray:()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
   3: astore_1
   4: aload_1
   5: ldc           #40                 // int 1
   7: aaload
   8: ldc           #42                 // class T
  10: invokeinterface #46,  2           // InterfaceMethod org/codehaus/groovy/runtime/callsite/CallSite.callConstructor:(Ljava/lang/Object;)Ljava/lang/Object;
  15: invokestatic  #52                 // Method org/codehaus/groovy/runtime/typehandling/ShortTypeHandling.castToString:(Ljava/lang/Object;)Ljava/lang/String;
  18: checkcast     #54                 // class java/lang/String

所以this是该演员阵容的罪魁祸首。这似乎适用于@TypeChecked / @CompileStatic

答案 1 :(得分:0)

这很可能是静态类型检查器中的错误。当表达式的LHS是String变量时,调用ShortTypeHandling.castToString()的转换将应用于RHS。

在Groovy 2.4.13中也是如此。