没有可访问的类型实例。

6
整段代码如下:
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();//使用test对象创建新对象


1
什么错误?看起来你只是重新粘贴了代码,导致出现了错误。 - Bohemian
2个回答

23

如果你将类MyThread更改为静态,就可以消除这个问题:

public static final class MyThread implements Runnable

由于您的main()方法是静态的,所以您不能依赖于封闭类的非静态类型或字段,除非您首先创建封闭类的实例。更好的做法是根本不需要这样的访问权限,这可以通过使相关类成为静态来实现。


3

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接