2012-09-18 80 views
4

整个代码:没有可以访问类型的封闭实例。

public class ThreadLocalTest { 
    ThreadLocal<Integer> globalint = new ThreadLocal<Integer>(){ 
     @Override 
     protected Integer initialValue() { 
      return new Integer(0); 
     } 
    }; 


    public class MyThread implements Runnable{ 
     Integer myi; 
     ThreadLocalTest mytest; 

     public MyThread(Integer i, ThreadLocalTest test) { 
      myi = i; 
      mytest = test; 
     } 

     @Override 
     public void run() { 
      System.out.println("I am thread:" + myi); 
      Integer myint = mytest.globalint.get(); 
      System.out.println(myint); 
      mytest.globalint.set(myi); 
     } 
    } 


    public static void main(String[] args){ 
     ThreadLocalTest test = new ThreadLocalTest(); 
     new Thread(new MyThread(new Integer(1), test)).start(); 
    } 
} 

为什么下面的代码片段:

ThreadLocalTest test=new ThreadLocalTest(); 
    new Thread(new MyThread(new Integer(1),test)).start(); 

会导致以下错误:

No enclosing instance of type ThreadLocalTest is accessible. Must qualify the allocation with an enclosing instance of type ThreadLocalTest (e.g. x.new A() where x is an instance of ThreadLocalTest).


的核心问题是: 我想在静态方法中初始化内部类。 这里有两种解决方案:

  1. 使内部类作为外部类

  2. 使用外部基准,如:

new Thread(test.new MyRunnable(test)).start();//Use test object to create new

+1

什么错误?我看起来像你刚刚重新粘贴代码作为错误 – Bohemian

回答

3

由于MyThread是你有一个内部类使用MyThreadTest的实例访问它:

public static void main(String args[]) { 
    MyThreadTest test = new MyThreadTest(); 
    new Thread(test.new MyThread(new Integer(1),test)).start(); 
} 
17

如果更改类MyThread静态,你消除这个问题:

public static final class MyThread implements Runnable 

由于您的main()方法是静态的,你不能依靠非静态类型或领域在没有首先创建封闭类的实例的情况下封闭类。更好的是,甚至不需要这样的访问,这是通过使所讨论的类是静态的来实现的。

相关问题