Имя пакета конфликтует с геттерами и сеттерами? - PullRequest
2 голосов
/ 13 июня 2010

люди. Итак, я столкнулся с этой ошибкой компиляции некоторое время назад ... Поскольку это легко исправить, и я не нашел ничего уместного в то время, я в конце концов позволил ей уйти.

Я только что вспомнил об этом, и теперь мне интересно, действительно ли это часть языковой грамматики (в чем я сильно сомневаюсь) или это ошибка компилятора. Мне это просто любопытно - это не сильно влияет на развитие, но было бы приятно узнать, видел ли кто-нибудь из вас это уже.

package view {
    import flash.display.Sprite;

    public class Main extends Sprite {
        private var _view:Sprite = new Sprite();

        public function Main() {
            this.test();
        }

        private function test():void {
            trace(this.view.x, this.view.y);
            //1178: Attempted access of inaccessible property x through a reference with static type view:Main.
            //1178: Attempted access of inaccessible property y through a reference with static type view:Main.
            //Note that I got this due to the package name.
            //It runs just fine if I rename the package or getter.
        }

        public function get view():Sprite {
            return this._view;
        }
    }
}

1 Ответ

3 голосов
/ 14 июня 2010

Я бы сказал, что это либо ошибка компилятора, либо несоответствие в spec .

Цитата из главы 11.1 Пространство имен пакета (я бы связался напрямую, но документы используютframes):

Пакеты существуют только во время компиляции.Статическое существование пакетов позволяет нам дать им определенные свойства, которые были бы невозможны, если бы ими можно было манипулировать во время выполнения.В частности:

Имена пакетов могут иметь встроенные точки.Полностью определенные ссылки на пакеты могут и должны быть выражены с помощью оператора точки, а не обычного синтаксиса :: :: для квалифицированных имен.

Но поскольку для имени пакета нет значения времени выполнения, пакеты не могут быть псевдонимами или иным образом использоваться ввыражение, которое использует значение времени выполнения.

При обнаружении компилятором в допустимом контексте значение имени пакета становится фиксированным;любая интерпретация во время выполнения больше невозможна.

По этой причине имя пакета всегда затеняет локально определенные имена, независимо от цепочки областей действия, когда это имя пакета используется в левой части оператора точки.

Теперь из вышесказанного я понимаю, что эта строка:

trace(this.view.x, this.view.y);

Не должна интерпретироваться компилятором как ссылка на пакет view, так как кажетсячтобы противоречить этому - я назову это A):

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

, потому что this, если я не ошибаюсь, это значение времени выполнения.

Тогда, если вы используете this, я думаю, что неопределенность может быть решена как ваш метод получения, но в соответствии с этим параграфом - давайте назовем его B), это не будет:

По этой причине имя пакета всегда затеняет локально определенные имена, независимо от цепочки областей действия, когда это имя пакета используется в левой части оператора точки.

Итак, если вы не используете this, из спецификации ясно, что view.x следует интерпретировать как ссылку на определение x в пакете view.

Если вы прямо скажете this, существует противоречие между А) и В), на мой взгляд.Согласно А) не должно быть псевдонимов;но, похоже, псевдоним происходит потому, что слева от оператора точки используется имя пакета.Поэтому я предполагаю, что компилятор не анализирует пакет в контексте, так сказать, просто проверяет, совпадает ли имя слева от оператора точки с именем определенного пакета.

...