下面是整个代码:

import java.util.ArrayList;

    public class Test<E extends Comparable<E>>{

    ThreadLocal<ArrayList<E>>arraylist=new ThreadLocal<ArrayList<E>>(){
        @Override
        protected ArrayList<E> initialValue() {
            // TODO Auto-generated method stub
            //return super.initialValue();
            ArrayList<E>arraylist=new ArrayList<E>();
            for(int i=0;i<=20;i++)
            arraylist.add((E) new Integer(i));
            return arraylist;
        }
    };


    class MyRunnable implements Runnable{

        private Test mytest;

        public MyRunnable(Test test){
            mytest=test;
            // TODO Auto-generated constructor stub
        }
        @Override
        public void run() {
                System.out.println("before"+mytest.arraylist.toString());
                ArrayList<E>myarraylist=(ArrayList<E>) mytest.arraylist.get();
                myarraylist.add((E) new Double(Math.random()));
                mytest.arraylist.set(myarraylist);
                System.out.println("after"+mytest.arraylist.toString());
            }

            // TODO Auto-generated method stub

        }
    public static void main(String[] args){

        Test test=new Test<Double>();

        System.out.println(test.arraylist.toString());

        new Thread(new MyRunnable(test)).start();

        new Thread(new MyRunnable(test)).start();

        System.out.println(arraylist.toString());

    }

}

我的问题是:
为什么会导致错误:
new Thread(new MyRunnable(test)).start();
“静态引用”指的是什么?

最佳答案

问题1:为什么新建线程(new myrunnable(test)).start();导致错误:
无法对非静态类型myrunnable进行静态引用?
答1:因为不能直接在静态上下文中实例化内部类。main方法总是static
要避免此错误,可以使用外部类引用初始化内部类,该内部类将该内部类绑定到指定的引用。

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

问题2:“静态参考”一词指的是什么?
答案2:new MyRunnable(test)不是静态的,您必须将MyRunnable设置为静态,才能这样访问。
您正在以最低效的方式使用泛型:)
声明MyRunnable<E>,因为Generics in static context is different than in normal object context
如果我正确理解您,您希望MyRunnable类理解传递给E类的Test
这不可能像你这样。
您必须使MyRunnable理解E,然后才能访问它。
static class MyRunnable<E extends Comparable<E>> implements Runnable {

    private Test<E> mytest;

    public MyRunnable(Test<E> test) {
        mytest = test;
        // TODO Auto-generated constructor stub
    }

    @Override
    public void run() {
        Test<Double> test = new Test<Double>();
        ArrayList<Double> doubles = test.arraylist.get();
        doubles.add(new Double(Math.random()));//No type cast needed
    }
    // TODO Auto-generated method stub

 }

10-06 05:43