无法对非静态类型MyRunnable进行静态引用

时间:2012-09-17 03:34:54

标签: java static-methods

以下是整个代码:

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

    }

}

我的问题是:

  1. 为什么new Thread(new MyRunnable(test)).start();会导致错误:
    Cannot make a static reference to the non-static type MyRunnable
  2. 术语“静态参考”是指什么?

2 个答案:

答案 0 :(得分:1)

你在没有static关键字的Test类中声明了MyRunnable类,因此它是一个“内部”类。您只能在外部类的实例中实例化内部类。您试图在静态方法中实例化它,因此没有外部实例。我的猜测是你的意图是MyRunnable类是一个嵌套类而不是内部类,所以你应该只将static关键字添加到类定义中。

答案 1 :(得分:0)

  

问题1:为什么要新线程(新的MyRunnable(测试))。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

 }