2

これに関する他のすべての質問を読みましたが、私の場合に型消去がある理由がわかりません。私は持っている

public <T extends Aclass&Binterface> boolean test(final T param) {
    ...
}

public boolean test(final Aclass pOtherPPShape) {
    ...
}

メソッド test(Aclass) には、タイプ ClassName の別のメソッドと同じ消去テスト (Aclass) があります

同じクラスで動作する 2 つのメソッドをどのように記述すればよいですか? (外部ライブラリからのものであるため、AClass を変更できず、このコードが動作するサブタイプが多数あります)

この場合、instanceof の使用は適切ですか?

編集:これを衝突テストで使用します。渡された形状がインターフェイスのインスタンスである場合、(インターフェイスのメソッドを使用して) 衝突マスクを取得し、「チェッカー」を呼び出します。そうでない場合は、いくつかの異なる処理を行うダミーの衝突マスクをインスタンス化して、 「チェッカー」と同じ方法 (パラメーターとして 2 つの形状と 2 つの衝突マスクを持つ)

4

1 に答える 1

1

問題は型消去に関するものであり、途中で型消去を使用して 1 つのパラメーターを「オーバーロード」することはできないことを認識しました (型消去-同化されます)。しかし、あなたが言うには、

ジェネリック型のシグネチャは異なりますが、なぜ競合が発生したのですか?

T extends Aclass&BinterfaceAclassは別物ですね。

はい、いいえ。実際にはそれらは区別されますが、type-erasure の下では区別されません**1。優れたリソースは次のように説明しています。あなたの場合はAclassで、2 つのメソッド間の競合につながりました。

説明は次のことを示唆しています...

解決策: combound**2 ジェネリック型宣言を形式化して、一意の左端の境界を確立します。

に置き換えます。は次のように作成されます<T extends Aclass&Binterface><T extends AandB>AandB

  1. メソッド シグネチャで定義interface AinterfaceするAclass

  2. もつAclass implement Ainterface

  3. を定義しinterface AandB extends Ainterface, Binterfaceます。

また

使用できますinstanceof


**1 「より長い波長は大気中の粒子によって屈折されるため」、Duncan Jones によると、もう 1 つの優れたリソースです。

**2 それはcompound、私が楽しみに抵抗できなかったからです :-/

于 2012-07-31T19:49:15.897 に答える