Я пытаюсь проверить тип простым скриптом Groovy:
@groovy.transform.TypeChecked
class C {
def fn() { return "result" }
def ln() { return fn().length() }
}
new C().ln()
Я ожидаю, что метод fn
будет выведен на String
, однако при попытке запустить скриптЯ получаю ошибку:
_GroovyUserScript_: 4: [Static type checking] - Cannot find matching method java.lang.Object#length(). Please check if the declared type is correct and if the method exists.
@ line 4, column 23.
def ln() { return fn().length() }
^
1 error
Значение типа возвращаемого значения для метода было java.lang.Object
. Теперь, если я изменю сценарий на
@groovy.transform.TypeChecked
...
String fn() { return "result" }
...
, сценарий будет скомпилирован правильно.
Однако я заметил, что следующий скрипт также правильно компилируется:
@groovy.transform.TypeChecked
class C {
def fn() { return "result" }
}
def x() {
new C().fn().length()
}
x()
Так что, возможно, проблема в том, что вывод типа не является транзитивным между методами одного класса по какой-то причине?