无法访问类型的封闭实例。 [复制]

2024-06-19

整个代码是:

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 类型的封闭实例进行分配(例如 x.new A() 其中 x 是 ThreadLocalTest 的实例)。


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

  1. 使内部类成为外部类

  2. 使用外部引用,例如:

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


如果你换班级MyThread to be static,你就消除了这个问题:

public static final class MyThread implements Runnable

自从你的main()方法是静态的,如果不首先创建封闭类的实例,则不能依赖封闭类的非静态类型或字段。不过,更好的是甚至不需要这种访问,这是通过将相关类设为静态来实现的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法访问类型的封闭实例。 [复制] 的相关文章

随机推荐