Краткий ответ: Вы не можете . В некоторых случаях пропускается объявление типа (или ключевое слово def
), но это не общее правило. Например, сценарии Groovy позволяют использовать переменные без указания типа c, например,
x = 10
Однако это работает, поскольку класс groovy.lang.Script
реализует getProperty
и setProperty
методы, которые запускаются при доступе к отсутствующему свойству. В этом случае такая переменная считается глобальной связью, а не локальной переменной. Если вы попытаетесь сделать то же самое с любым другим классом, который не реализует эти методы, вы получите groovy.lang.MissingPropertyException
.
Поддерживается пропуск типов в объявлении метода, как в динамически компилируемой, так и статически компилируемой Groovy. Но полезно ли это? Это зависит. В большинстве случаев гораздо лучше объявить тип для лучшей читаемости и целей документирования. Я бы не рекомендовал делать это в API publi c - пользователь вашего API увидит тип Object
, в то время как вы можете ожидать некоторый конкретный тип c. Это показывает, что это может сработать, если вы хотите получить какой-либо объект, независимо от того, какой у него тип c. (Например, такой метод, как dump(obj)
, может так работать.)
И, наконец, что не менее важно, есть способ пропустить объявление типа в любом контексте. Для этого вы можете использовать ключевое слово final
.
class Foo {
final id = 1
void bar(final name) {
final greet = "Hello, "
println greet + name + "!"
}
}
Таким образом, вы можете получить код, который компилируется с динамической компиляцией c, а также с включенной компиляцией stati c. Конечно, использование ключевого слова final
предотвращает повторное присвоение переменной, но для компилятора этой информации достаточно, чтобы вывести правильный тип.
Для получения дополнительной информации вы можете проверить аналогичный вопрос, который был спросил SO некоторое время go: Groovy: ключевое слово "def" против конкретного типа