synthetic
Java 在称为和的方法上有特殊标记bridge
。
JLS 13.1.7,“Java 编译器引入的任何在源代码中没有相应构造的构造都必须标记为合成……”
因此,合成方法是由编译器生成的任何东西,而不是在源代码中表示的东西,尽管该规范 PDF 中没有很好地提及它,但桥接方法用于类型检查泛型。(例如Animal.interactWith(Creature c)
,获得一个桥接方法interactWith(Object c)
,该方法转换为 Creature 并调用另一个方法。)
我们有一个名为 Bukkit 的 API,它提供了稳定的访问来改变 Minecraft 服务器的工作方式。API 底层实现的一个方面(又名 vanilla Minecraft),我们几乎无法控制,最近在版本中被迫1.6.1
从整数值更改为浮点值。并且为了避免再次更改的困难,我们选择将我们所有的 API 方法更改为double
s.
因此,例如:
public int getHealth();
public void setHealth(int health);
// Must now be
public double getHealth();
public void setHealth(double health);
但是,与往常一样,我们希望使用以前版本编译的插件1.5.2
,仍然尽可能地工作——这就是 API 的全部意义所在。
这setHealth
是一个已解决的问题,只需引入一个重载。目前,我们有一个名为的方法,它在实现编译(而不是API 编译)时_INVALID_getHealth(V)I
被重命名为,这让旧插件继续运行。getHealth(V)I
然而,当有人试图扩展我们对这些重命名方法的实现时,他们会从双重命名的方法和覆盖中得到编译错误。
有没有办法使用手动/工具插入的合成或桥接方法同时提供int
和返回,这不会导致那些试图更改我们 API 实现部分的人编译错误?double