类型的无封闭情况下进行访问。 [重复](No enclosing instance of typ

2019-07-31 16:43发布

这个问题已经在这里有一个答案:

  • 爪哇- Foo类型的无封闭情况下是可访问的 5个答案

完整的代码:

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

会导致以下错误:

类型ThreadLocalTest没有外围实例访问。 必须用类型ThreadLocalTest的包封实例限定分配(egxnew A(),其中x是ThreadLocalTest的一个实例)。


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

  1. 使内部类作为外部类

  2. 使用像外参考:

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

Answer 1:

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

public static final class MyThread implements Runnable

由于您main()方法是静态的,你不能没有先建立封闭的类的实例依靠非静态类型或封闭类的字段。 较好的,但,是不是更需要这样的访问,这是通过使类问题静态完成。



Answer 2:

由于MyThread是一个内部类,你必须使用一个实例来访问它MyThreadTest

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


文章来源: No enclosing instance of type is accessible. [duplicate]