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