Рубрики
Без рубрики

Groovy не всегда разрешает такие методы, как Java

Осознание языкового багажа. Помечено как groovy, java, программирование, разработка программного обеспечения.

Речь идет об ошибке (или функции?) в Groovy, а также о подходе к изучению новых языков программирования.

Недавно, рассматривая приведенный ниже код как код Java, я пришел к выводу, что все вызовы в вышеупомянутой программе действительны. Поскольку Groovy происходит от Java, я предположил, что то же самое верно и в Groovy.

Однако, когда я выполнил фрагмент кода с помощью интерпретатора Groovy, в строке 6 произошел сбой со следующим выводом

Bar called from Site foo1
This: class A
Bar called from Site foo2
Bar called from Site cow
Bar called from Site foo1
This: class B
Caught: groovy.lang.MissingMethodException: No signature of method: B.bar() is applicable for argument types: (java.lang.String) values: [Site foo2]
Possible solutions: wait(), any(), wait(long), is(java.lang.Object), use([Ljava.lang.Object;), each(groovy.lang.Closure)
groovy.lang.MissingMethodException: No signature of method: B.bar() is applicable for argument types: (java.lang.String) values: [Site foo2]
Possible solutions: wait(), any(), wait(long), is(java.lang.Object), use([Ljava.lang.Object;), each(groovy.lang.Closure)
 at A$_foo_closure1.doCall(testClosuresAndClasses.groovy:6)
 at A$_foo_closure1.doCall(testClosuresAndClasses.groovy)
 at A.foo(testClosuresAndClasses.groovy:8)
 at testClosuresAndClasses.run(testClosuresAndClasses.groovy:24)

Судя по выводам, методы были правильно разрешены на всех сайтах вызовов, выполненных в рамках выполнения строк 22 и 23. Под правильным я подразумеваю, что они были разрешены в соответствии со стратегией разрешения методов, используемой в Java, т.Е. A.bar был выполнен, когда bar был вызван в строке 16 в результате выполнения cow на экземпляре B на сайте вызова в строке 23. Однако, похоже, что та же стратегия разрешения метода не использовалась на сайте вызова в строке 6, когда закрытие x было выполнено в результате выполнения foo на экземпляре B на сайте вызова в строке 24.

Копнув глубже, я узнал, что замыкания в Groovy являются экземплярами класса замыкания, и они могут быть не связаны с классами (не объектами), в которые они заключены, или классами, которые определяют методы, вызываемые в них. Итак, я подумал: “Может ли это быть причиной? и добавил строку 5, чтобы распечатать тип используемого приемника в строке 6. Очевидно, его тип – B, и все же Groovy не смог правильно разрешить метод. Что происходит?

При поиске этой ошибки/функции я наткнулся на эти проблемы в трекере проблем Groovy.

По-видимому, это известная проблема, и сообществу groovy еще предстоит решить, является ли это ошибкой или функцией: ) [См. Ветку комментариев по вопросу GROOVY-3010] Ну и что?

Ну, как бы мне этого ни хотелось, дело не в том, что я в восторге от того, что нашел ошибку в Groovy и внес свой вклад в Groovy:) Речь идет о том, что я считал само собой разумеющимся правильным в Groovy из-за моего опыта работы с Java и того, как это повлияло на мое восприятие того, что я наблюдал в Groovy.

Groovy действительно начинался как язык сценариев на основе JVM, который мог легко взаимодействовать с Java и заимствовал функции из Java (и других языков). Однако это не означает, что Groovy должен поддерживать эти функции, как это делает Java. Как другой язык, он может свободно предлагать эти функции, но с другой семантикой. Хотя это отлично подходит для экспериментов с новыми функциями/семантикой языка программирования, это также является проблемой для разработчиков Java, пытающихся использовать Groovy. Тем не менее, я думаю, что боль причиняется самому себе, поскольку она проистекает из неправильной попытки рассматривать Groovy как другой вид Java.

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

Тем не менее, лингвист во мне предпочел бы четко определенную семантику для Groovy:)

[Примечание: Этот пост первоначально появился здесь .]

Оригинал: “https://dev.to/rvprasad/groovy-does-not-always-resolve-methods-like-java-2o5”