4

タスクのスケジューリングからの戻り値を匿名クラスに渡そうとしていますが、問題が発生しています。戻り値を最終変数に設定すると、初期化されていないと表示されます。

/* Not initialized */
final BukkitTask task = Bukkit.getScheduler().runTaskTimer(plugin, new Runnable() {

    public void run() {
        /* irrelevant code */
        task.cancel();
    }

}, 0L, 20L);

また、匿名クラス内でメソッドを呼び出して変数を渡そうとしましたが、戻り値の型が void に変更されるため、適切な値を渡すことができません。

BukkitTask temp = null;
/* Returns void */
temp = Bukkit.getScheduler().runTaskTimer(plugin, new Runnable() {

    private BukkitTask task;

    public void initTask(BukkitTask task) {
        this.task = task;
    }

    public void run() {
        /* irrelevant code */
        task.cancel();
    }

}.initTask(temp), 0L, 20L);

戻り値をコード内の匿名クラスに渡すにはどうすればよいですか?

4

5 に答える 5

3

このクラスを定義できます

class Box<T> {
    public volatile T value;
}

次のように使用します。

final Box<BukkitTask> taskBox = new Box<BukkitTask>();
taskBox.value = Bukkit.getScheduler().runTaskTimer(plugin, new Runnable() {
    public void run() {
        /* irrelevant code */
        taskBox.value.cancel();
    }
}, 0L, 20L);

ただし、ランナブルを実際にいつ実行するかによっては、taskBox.value依然としてrun異なる可能性があります。nullrunTaskTimer

于 2013-11-01T14:25:14.683 に答える