В groovy разрешено ли ссылаться на частные переменные-члены из-за закрытия?

Пример кода, который можно легко запустить в GroovyConsole в разделе groovy 2.4.4:

import groovy.transform.CompileStatic

class Echo {
    public void text(String txt) {
        println txt
    }
}

class Test {
    private Echo echo = new Echo()
    @CompileStatic
    public void doStuff() {
        Closure c = {
            echo.text('hi')
        }
        c()        
    }
}

new Test().doStuff()

Он не работает с java.lang.ClassCastException: Test$_doStuff_closure1 cannot be cast to Test.

Интересно, что если я удалю аннотацию @CompileStatic или сделаю переменную-член не частной, она будет работать как ожидалось.

Изменить: зарегистрирована проблема JIRA GROOVY-7558

Ответ 1

Я думаю, что вы обнаружили ошибку. Если бы ожидалось, что @CompileStatic запретит доступ к закрытой переменной, то это тоже не сработает

import groovy.transform.CompileStatic

class Echo {
    public void text(String txt) {
        println txt
    }
}

@CompileStatic
class Test {
    private Echo echo = new Echo()

    public void doStuff() {
        Closure c = {
            echo.text('hi')
        }
        c()
    }
}

new Test().doStuff()

Но это не так. Есть некоторые Jiras, которые могут быть той же проблемой (GROOVY-6278, GROOVY-7165, GROOVY-6468), но я не уверен, является ли коренная причина такой же. Я бы сказал, открывай новую Джиру для этого.