3

这是整个代码:

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. 术语“静态引用”指的是什么?
4

2 回答 2

1

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

于 2012-09-17T03:37:37.060 回答
0

问题一:为什么是 new Thread(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

 }
于 2012-09-17T03:37:38.403 回答