范围内不能访问该类型的封闭实例

时间:2011-03-25 23:41:06

标签: java

我有这段代码:

Thread thread = new Thread(null, vieworders, "MagentoBackground");
thread.start();
m_progressDialog = ProgressDialog.show(SoftwarePassionView.this, 
    "Please wait...", "Retrieving data...", true);

这会产生以下编译错误:

  

在范围

中无法访问类型为SoftwarePassionView的封闭实例

这是如何引起的?如何解决?

3 个答案:

答案 0 :(得分:11)

如果示例代码段中的代码在非静态内部/嵌套类中找到,并且其中一个封闭类为SoftwarePassionView.this,则表达式SoftwarePassionView才有意义。它说“给我封闭的SoftwarePassionView 实例”。

如果此代码不在该上下文中(如编译器错误所示),则需要将表达式替换为普通变量名称或方法调用,以提供对某些SoftwarePassionView对象的引用。 / p>


对于记录,这是一个SoftwarePassionView.this不是编译错误的例子:

public class SoftwarePassionView {

    public class Inner {
        ...
        public void doIt() {
            Thread thread = new Thread(null, vieworders, "MagentoBackground");
            thread.start();
            m_progressDialog = ProgressDialog.show(SoftwarePassionView.this, 
                  "Please wait...", "Retrieving data...", true);
        }
    }
}

答案 1 :(得分:5)

你试图获得封闭类的this,如果你在一个匿名类中,这将有效,但我猜这不是这种情况。

请阅读http://mindprod.com/jgloss/this.html

答案 2 :(得分:4)

如果要将代码段放在不同的类而不是SoftwarePassionView中,可以在线程构造函数中传递类SoftwarePassionView的实例。

以下是一个例子:

Class SoftwarePassionView {
  ....

  Thread thread = new something(SoftwarePassionView);
  thread.start();
  ......
  }

在另一个班级

 Class something extends Thread{
  SoftwarePassionView SPV;
  something(SoftwarePassionView){
  super(null, vieworders, "MagentoBackground");
  this.SPV = SoftwarePassionView}
  }

   @Override
public void run(){
    m_progressDialog = ProgressDialog.show(SPV, 
    "Please wait...", "Retrieving data...", true);
     }

  }