У меня есть приложение 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 { }
Другие проверки типа сделать работу. Я еще не обнаружил никакой логики, так что любые указатели в правильном направлении приветствуются.
@ TypeChecked/@ CompileStatic должен давать ошибку времени компиляции, если бросок скорее всего не удастся. WeSt не дал версию Groovy, так что ошибка могла быть исправлена уже – blackdrag
@cfrick Это действительно интересный вывод, который у вас там, спасибо большое. Мне пришлось пройти пару минут, чтобы проверить, и действительно кажется, что любой класс преобразуется в 'String', не компилятор, дающий ошибку. Я проведу немного больше сегодня, но если это будет справедливо, я не могу не задаться вопросом, почему я раньше не наткнулся на это. В документах должно быть какое-то упоминание в документах. – WeSt
@blackdrag Я использую версию 2.4.3. Не самый новый, но довольно новый. – WeSt