3

複雑なジェネリック型 (複数のインターフェイスを実装する) を返すメソッドがあります。

protected abstract <BOB extends Stan & Jan<I>> BOB getStanAndJanItem();

これは正常にコンパイルされ、オーバーライドして値を返すことができます。ただし、呼び出すとすぐにコンパイルエラーが発生します(何かに割り当てる必要さえありません)。BOB はメソッド内でのみ定義されているため、これは理にかなっていると思います。

では、クラス レベルでボブを定義するにはどうすればよいでしょうか。

はい、呼び出しを分割して同じオブジェクトを返すか、追加の継承を導入することができることはわかっていますが(おそらくそれを行うことになります)、この方法でも実行できますか?

受信したエラー:
バウンドの不一致: 型のジェネリック メソッド getStanAndJanItem() はMyAbstractClass<I>、引数 () には適用できません。推論されたタイプ Stan は、境界付きパラメーターの有効な代替ではありません<BOB extends Stan & Jan<I>>

4

2 に答える 2

0

メソッドを呼び出すには、制約に一致するジェネリック型パラメーターを渡す必要があります。
特定の呼び出しでそれが必要ない場合でも、型パラメーターを渡す必要があります。

したがって、メソッドを呼び出すことができるのは、これらの両方の型を実装するクラスまたはインターフェイスでメソッドをパラメーター化する場合のみです。

于 2011-11-07T21:30:27.500 に答える
0

本当の問題は、交差タイプがサポートされていないことです。言語がそれを直接サポートすると仮定すると、交差点タイプA&Bなどを書くことができ、あなたの例は次のようになります

Stan&Jan<I> getStanAndJanItem()

void setStanAndJanItem(Stan&Jan<I> item)


Stan&Jan<I> result = getStanAndJanItem();
result.doStanStuff();
result.doJanStuff();

setStanAndJanItem(result);

そのようなサポートがなければ、私たちは立ち往生しています。ジェネリック宣言が間違っている可能性があります。これは、呼び出し元がBOB型を決定することを暗示していますが、おそらく実装にBOB型を決定させたいと考えています。Stan実装は、との両方を実装するものなら何でも返すことができJan<I>ます。現在、その要件を表明することはできません。

于 2011-11-08T02:06:00.413 に答える