Почему я не могу использовать <Class>.this в анонимном классе? - PullRequest
5 голосов
/ 18 августа 2011

Я недавно использую этот код и понимаю, что в анонимном классе я не могу получить доступ к экземпляру с помощью .this, например:

Sprite sprFace = new Sprite() {

    @Override
    protected void onManagedUpdate(float pSecondElapsed) {
        runOnUpdateThread(new Runnable() {

        @Override
        protected void run() {    
            Sprite.this.getParent().detach(Sprite.this); // Here
        }});
    }

};

Я знаю, как его решить (просто объявитьменя "переменная), но мне нужно знать, почему я не могу использовать <Class>.this?

Ответы [ 2 ]

4 голосов
/ 18 августа 2011

Синтаксис <Class>.this дает особый способ ссылки на объект типа <Class>, в отличие от типа теневого копирования.

Кроме того, <Class> должно быть именем типа, который выпытаешься получить доступ.В вашем случае Sprite - это , а не фактический тип sprFace.Скорее, sprFace является экземпляром анонимного подкласса из Sprite, поэтому синтаксис неприменим.

1 голос
/ 18 августа 2011

Тип внешнего объекта не Sprite, а скорее анонимный подкласс Sprite, и у вас нет возможности назвать этот анонимный подкласс в вашем коде.

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

class MySprite extends Sprite {

    @Override
    protected void onManagedUpdate(float pSecondElapsed) {
        runOnUpdateThread(new Runnable() {
            MySprite.this.getParent().detach(MySprite.this); // Here
        });
    }

};

Sprite sprFace = new MySprite();
...