Groovy не определяет тип возвращаемого значения метода - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь проверить тип простым скриптом 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()

Так что, возможно, проблема в том, что вывод типа не является транзитивным между методами одного класса по какой-то причине?

1 Ответ

0 голосов
/ 08 октября 2019

В groovy def равно Object, поэтому первый случай корректно завершается неудачей.

И @groovy.transform.TypeChecked проверяет только класс или метод, который он аннотирует. во втором случае метод def x(){...} не аннотирован (он объявлен вне класса). Таким образом, проверка не выполняется на этапе компиляции.

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