Groovy类型签入脚本未按预期工作

Groovy类型签入脚本未按预期工作,groovy,type-conversion,typechecking,Groovy,Type Conversion,Typechecking,我有一个Groovy应用程序,允许用户通过Groovy脚本添加自定义行为。我通过GroovyShell包含这些脚本,并通过类型检查扩展对它们进行类型检查。我如何在应用程序中包含脚本的完整代码如下: def config = new CompilerConfiguration() config.addCompilationCustomizers( new ASTTransformationCustomizer(TypeChecked) ) def shell = new GroovyShe

我有一个
Groovy
应用程序,允许用户通过
Groovy
脚本添加自定义行为。我通过
GroovyShell
包含这些脚本,并通过
类型检查扩展对它们进行类型检查。我如何在应用程序中包含脚本的完整代码如下:

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
}
我甚至可以走得更远。在脚本中创建
时,我可以将其分配给
字符串
,不会出现任何错误:

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

class Test { }

其他类型检查起作用。我还没有发现它背后的任何逻辑,因此非常感谢任何指向正确方向的指针。

如果有疑问,请反对。这是一个类似于您的调用的位:
String x=new T()


演员阵容的罪魁祸首也是如此。这似乎也适用于
@TypeChecked
/
@CompileStatic

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


这在Groovy 2.4.13中仍然适用。

@TypeChecked/@CompileStatic应该给出编译时错误,如果强制转换很可能不会成功。WeSt没有提供Groovy版本,因此该错误可能已经修复already@cfrick这是一个非常有趣的发现,非常感谢。我有几分钟的时间进行测试,似乎任何类都可以转换为
String
,而编译器不会给出错误。今晚我会再测试一次,但如果这是真的,我不禁想知道为什么我没有更早地发现这一点。至少需要在文档中提及一些内容。@blackdrag我使用的是2.4.3版。不是最新的,而是相当新的。对不起,我忘了有些案例总是有效的。String和boolean/boolean就是这种情况。很抱歉,我的错noise@WeSt如果有疑问,开一张罚单。友好的人们会引导你。我的猜测是,这是我们想要的行为,但可能缺少一些文档。
   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