【发布时间】: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