No enclosing instance of type is accessible.
Solution 1
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.
Solution 2
Since MyThread
is an inner class you have to access it using an instance of MyThreadTest
:
public static void main(String args[]) {
MyThreadTest test = new MyThreadTest();
new Thread(test.new MyThread(new Integer(1),test)).start();
}
kaiwii ho
Updated on July 18, 2022Comments
-
kaiwii ho almost 2 years
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:
make the inner class as outer class
use outer reference like :
new Thread(test.new MyRunnable(test)).start();//Use test object to create new