2015-11-23 2 views
1

У меня есть приложение Groovy, в котором я разрешаю пользователю добавлять настраиваемое поведение через скрипты Groovy. Я включаю эти сценарии через GroovyShell и набираю их через Type Checking Extensions. Полный код того, как я включаю сценарий в свою заявку, это:Groovy - проверка типов в скрипте не работает должным образом

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 [email protected] on the console 

class Test { } 

Другие проверки типа сделать работу. Я еще не обнаружил никакой логики, так что любые указатели в правильном направлении приветствуются.

ответ

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

@ TypeChecked/@ CompileStatic должен давать ошибку времени компиляции, если бросок скорее всего не удастся. WeSt не дал версию Groovy, так что ошибка могла быть исправлена ​​уже – blackdrag

+1

@cfrick Это действительно интересный вывод, который у вас там, спасибо большое. Мне пришлось пройти пару минут, чтобы проверить, и действительно кажется, что любой класс преобразуется в 'String', не компилятор, дающий ошибку. Я проведу немного больше сегодня, но если это будет справедливо, я не могу не задаться вопросом, почему я раньше не наткнулся на это. В документах должно быть какое-то упоминание в документах. – WeSt

+0

@blackdrag Я использую версию 2.4.3. Не самый новый, но довольно новый. – WeSt

0

Это, скорее всего, ошибка в Static Type Checker. Когда LHS выражения является переменной String, к RHS применяется обращение, вызывающее ShortTypeHandling.castToString().

Это относится к Groovy 2.4.13.

Смежные вопросы