【问题标题】:Why can't I use <Class>.this in anonymous class?为什么我不能在匿名类中使用 <Class>.this?
【发布时间】:2011-08-18 06:05:45
【问题描述】:

我最近使用这段代码,发现在匿名类中,我无法通过.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
        }});
    }

};

我知道如何解决它(只需声明一个“我”变量),但我需要知道为什么我不能使用&lt;Class&gt;.this

【问题讨论】:

  • @Thilo 抱歉,我有一个拼写错误。我将返回 Runnable。

标签: java oop anonymous anonymous-class


【解决方案1】:

&lt;Class&gt;.this 语法提供了一种特殊的方式来引用 &lt;Class&gt; 类型的对象,而不是阴影类型。

此外,&lt;Class&gt; 必须是您尝试访问的类型的名称。在您的情况下,Sprite不是sprFace 的实际类型。相反,sprFaceSprite 的匿名子类 的一个实例,因此语法不适用。

【讨论】:

    【解决方案2】:

    外部对象的类型不是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();
    

    【讨论】:

    • 但这和说this.getParent()getParent()是一样的
    • 感谢您的回答,但我宁愿声明我是变体。
    • W.N.:我不知道你所说的“声明我变种”是什么意思。
    • Thile:没有。请注意,匿名Runnable 内部有一个匿名Runnablethis 将引用 Runnalbe 实例。
    • @Thilo: 但是你不能使用get对象作为方法参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多