我试图将调度任务的返回值传递给匿名类,但是我遇到了麻烦。如果我将返回值设置为最终变量,则表示未初始化:

/* 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);

如何在代码中将返回的值传递给匿名类?

最佳答案

您可以定义此类

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中的null仍然可以是runTaskTimer

10-06 08:48