the martian marciano groovy type-conversion typechecking

martian - Groovy: el script de comprobación de tipos no funciona como se esperaba



groovy el marciano (1)

Tengo una aplicación Groovy en la que le permito al usuario agregar un comportamiento personalizado a través de los scripts de Groovy . GroovyShell esos scripts a través de GroovyShell y los GroovyShell a través de las Type Checking Extensions . El código completo de cómo incluyo el script en mi aplicación es:

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

Esto funciona bien Sin embargo , la comprobación de tipos en el script parece estar seriamente rota. Por ejemplo, puedo incluir los siguientes scripts sin ninguna queja del compilador:

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 }

Puedo incluso ir más allá de eso. Al crear una class dentro del script, puedo asignarlo a una String sin ningún error:

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

Otras comprobaciones de tipo funcionan. Todavía no he descubierto ninguna lógica detrás de esto, por lo que cualquier indicador en la dirección correcta es muy apreciado.


Si tiene dudas, descanse. Este es el bit de una llamada similar a la tuya: 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

Entonces este es el culpable de ese elenco. Esto también parece ser cierto para @TypeChecked / @CompileStatic .