7

syntheticJava には、 および と呼ばれるメソッドに特別なマーカーがありbridgeます。

JLS 13.1.7、「Java コンパイラによって導入された、ソース コードに対応する構成要素がない構成要素はすべて、合成としてマークする必要があります...」

そのため、合成メソッドはコンパイラによって生成され、ソース コードでは表現されないものであり、その仕様 PDF ではあまり言及されていませんが、ブリッジメソッドはジェネリックの型チェックに使用されます。(たとえば、 Creature にキャストして他のメソッドを呼び出すAnimal.interactWith(Creature c)bridge メソッドを取得します。)interactWith(Object c)


Minecraft サーバーの動作を変更するための安定したアクセスを提供する Bukkit と呼ばれる API があります。API の基礎となる実装 (別名バニラ Minecraft) の 1 つの側面は、ほとんど制御できませんが、最近バージョン1.6.1で整数値から浮動小数点値への変更が強制されました。また、別の変更による困難を回避するために、すべての API メソッドをdoubles に変更することにしました。

たとえば、次のようになります。

public int getHealth();
public void setHealth(int health);
// Must now be
public double getHealth();
public void setHealth(double health);

ただし、いつものように、以前のバージョンでコンパイルされたプラグインが1.5.2可能な限り機能するようにしたいと考えています。これが API の要点です。

これsetHealthは解決済みの問題です。オーバーロードを導入するだけです。現在、_INVALID_getHealth(V)I実装コンパイル時に ( API コンパイルではなくgetHealth(V)I) に名前が変更されているという名前のメソッドがあり、これにより古いプラグインを引き続き実行できます。

ただし、誰かがこれらの名前が変更されたメソッドの実装を拡張しようとすると、二重に名前が付けられたメソッドとオーバーライドからコンパイル エラーが発生します。

API実装の一部を変更しようとする人にコンパイルエラーを引き起こさない、手動/ツール挿入の合成またはブリッジメソッドを使用して、intdoubleリターンの両方を提供する方法はありますか?

4

2 に答える 2

-1

エンティティの健康状態で何かをしたい場合は、にキャストできますDamageable。そうすれば、コンパイル エラーは発生しなくなります。

Entity e = /* some entity */;
double health = ((Damageable) e).getHealth();

これはうまくいくはずです。お役に立てば幸いです

于 2013-07-16T10:39:35.653 に答える