Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

No enclosing instance of type is accessible. [duplicate]

The whole code is:

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();
    }
}

why the following snippet:

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

cause the following error:

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).


The core problem is that: i want to initialize the inner class in the static methods. here are two solutions:

  1. make the inner class as outer class

  2. use outer reference like :

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

like image 663
kaiwii ho Avatar asked Sep 18 '12 06:09

kaiwii ho


1 Answers

If you change class MyThread to be static, you eliminate the problem:

public static final class MyThread implements Runnable

Since your main() method is static, you can't rely on non-static types or fields of the enclosing class without first creating an instance of the enclosing class. Better, though, is to not even need such access, which is accomplished by making the class in question static.

like image 141
seh Avatar answered Oct 14 '22 12:10

seh