我正在尝试使用此方法创建一个启动Scheduler任务的插件:
public void newCountdown() {
Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
public void run() {
for (Player player : Bukkit.getServer().getOnlinePlayers()) {
player.sendMessage("Hey");
}
}
}, 0, 20);
}
问题是,当我尝试调用该方法时,它说它需要是一个静态方法。然后,当我将它改为静态时,第一个参数"这个"说它不能在静态环境中使用。
当方法不是静态时,scheduleSyncRepeatingTask
会显示此错误:
BukkitScheduler类型中的方法scheduleSyncRepeatingTask(Plugin,Runnable,long,long)不适用于参数(activateDevMode,new Runnable(){},int,int)
当我尝试它给我的任何快速修复时,它总会导致另一个错误。
有没有办法从Main类引用this
而不必让我的方法保持静态?
答案 0 :(得分:1)
这不起作用的原因是因为static
和this
永远不会在一起。考虑它的一个简单方法是static
删除Java的面向对象部分。 this
是一个指向您班级当前实例的关键字,不能与static
一起使用,因为使用static
变量就像完全删除所有实例一样。
您必须将this
更改为Main
班级的实例(extends JavaPlugin
)。您可以初始化静态变量onEnable()
以存储实例
public static Main that; //"Main" will be replaced with the name of your Main class
@Override
public void onEnable(){
//set that to an instance of your Main class (this)
that = this;
}
@Override
public void onDisable(){
//set that to null to prevent memory leaks
that = null;
}
现在,您可以通过将newCountdown()
替换为that
this
方法保持静态
public static void newCountdown() {
Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(Main.that, new Runnable() {
public void run() {
for(Player player : Bukkit.getServer().getOnlinePlayers()){
player.sendMessage("Hey");
}
}
}, 0, 20);
}