1

Runnableスケジュールするタスクとして数ミリ秒かかる add メソッドを持つ ThreadPool クラスがあります。

public static void addScheduler(Runnable r, long millis) {
 //scheduling code
 //now I want to save it to check later
 ScheduledTask st = new ScheduledTask();
 st.setTaskType(r.getClass());
 st.setFrequency(millis);
 persistentes.add(st); //this is an ArrayList<ScheduledTask>
}

後で確認するために、タスク情報を ArrayList に格納したいのですが、タスクの情報を保存して taskType を確認すると、常に java.lang.Class になっています。これはJavaの型消去が原因だと理解していますが、クラスの型を保存する方法はありますか?

これは私の ScheduledTask クラスです:

public class ScheduledTask {

    private Class<?> taskType;
    private long frequency;

    public Class<?> getTaskType() {
        return taskType;
    }

    public void setTaskType(Class<?> taskType) {
        this.taskType = taskType;
    }

    public long getFrequency() {
        return frequency;
    }

    public void setFrequency(long frequency) {
        this.frequency = frequency;
    }

    public String toString(){
        return taskType.getClass().getName()+ ": " + (frequency / 1000) + " seg.";
    }
}
4

2 に答える 2

1

あなたの間違いは、あなたgetClass()が何度も電話をかけすぎていることだと思います:

public String toString(){
    return taskType.getClass().getName() + ": " + (frequency / 1000) + " seg.";
}

taskTypeは探しているクラスです ( などMyTask)。その (生の) タイプと、余分な呼び出しによって返されるものはgetClass()is ですjava.lang.Class

public String toString(){
    return taskType.getName() + ": " + (frequency / 1000) + " seg.";
}
于 2012-05-31T07:04:41.477 に答える
-1

newInstance() を使用して新しいインスタンスを作成し、(instanceof 演算子を使用して) タイプを確認できます。getName() を使用してクラスの名前を取得し、文字列比較を使用することもできます

于 2012-05-31T07:00:04.213 に答える