【问题标题】:Bukkit - Why does casting to Damageable work?Bukkit - 为什么投射到可损坏的工作?
【发布时间】:2014-05-20 11:35:09
【问题描述】:

从 Bukkit 1.6.4 开始,玩家的生命有了另一种处理方式,从现在开始,生命以双倍存储。为了与旧插件兼容,Player.getHealth() 方法是模棱两可的,有:

@Deprecated
public int getHealth();
public double getHealth();

我尝试使用Player.getHealth(),结果出现错误。我搜索了一个解决方案,但是像double d = (double) player.getHealth()double d = new Double(player.getHealth()); 这样的东西仍然会抛出错误The method getHealth() of Player is ambigious(我正在使用Eclipse btw。)。但经过一番搜索,我也发现了这个:

Damageable d = player; //because player is a Damageable
double health = d.getHealth();
//the method called is the "new one", which returns a double

我不明白为什么会这样,因为我查看了 Damageable,而这两种模棱两可的方法已经在 Damageable 中定义了。上面描述的错误也应该出现在这里。我哪里错了?我错过了什么?

提前致谢。

【问题讨论】:

  • 您能否发布相关 javadoc 的链接。我发现的只是 double 方法。
  • 我认为你的意思是:jd.bukkit.org/rb/apidocs/org/bukkit/entity/…jd.bukkit.org/rb/apidocs/org/bukkit/entity/Player.html(第二个是 Player 的文档,但这两种方法只是在 Damageable 中列出(第一个链接))但我认为这些可以'无法帮助您解决问题。
  • 好像是这样。 javadocs 和源代码都没有提到这个方法,但是查看craftbukkit.jar 中的.class 文件表明它确实存在。事实上,名称中带有 _INVALID_ 前缀的所有方法似乎都丢失了该前缀。对 ClassFileTransformer 的快速搜索一无所获,而且我对这种东西的编译时突变还不够擅长,无法弄清楚这一点。
  • 顺便说一句,我对 java 规范的理解是这是一个编译时错误。如果这恰好是正确的,并且 bukkit 使用某种黑魔法来解决这个问题,那么我怀疑调用该类方法的行为可能没有很好地定义,并且可能因 jvm 而异。

标签: java interface minecraft overloading bukkit


【解决方案1】:

这是因为在 Minecraft 1.6.4 及更高版本中,生命值现在存储在浮点数中。 Bukkit 决定使用 double 来防止将来从 float 更改为 double。如果您不在任何地方使用NMS,请仅使用bukkit,而不是craftbukkit,因为这样您就可以使用double d = player.getHealth();。否则,如果您需要craftbukkit,您可以将bukkit 放在高于craftbukkit 的构建层次结构中。

Damageable.getHealth() 是 Bukkit 的一个方法,所以它没有被弃用,而 Player.getHealth() 是 CraftBukkit 的一个方法(CraftBukkit 使用的代码主要来自原始的 Minecraft 服务器,(称为 NMS),所以它 IS 已弃用。尽管如果您要从构建路径中删除 CraftBukkit,或者将 Bukkit 放在其上方,那么 Player.getHealth() 将起作用。

Bukkit 弃用了使用整数的 .getHealth() 方法,虽然它们仍然有效,但很快就会被删除。所以,此刻,你需要使用double health = ((Damageable) player).getHealth();

【讨论】:

  • 不幸的是,这不是我所要求的。您在回答中为该问题提供了一个很好的解决方案,但我问为什么 Damageable.getHealth() 有效,尽管这种方法是模棱两可的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-04
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多