以下是整个代码:
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();
会导致错误:Cannot make a static reference to the non-static type MyRunnable
?答案 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
}