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

キーワードを使用せずに Test クラス内で MyRunnable クラスを宣言したstaticため、これは「内部」クラスです。外部クラスのインスタンス内でのみ内部クラスをインスタンス化できます。静的メソッドでインスタンス化しようとしているため、外部インスタンスはありません。私の推測では、 MyRunnable クラスを内部クラスではなくネストされたクラスにすることが意図されているため、 static キーワードをクラス定義に追加するだけです。

于 2012-09-17T03:37:37.060 に答える
0

質問 1: なぜ 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クラスに理解してもらいたいと思います。あなたがやっているように、これは不可能です。ETest

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 に答える