私は私のAPIで、このようなものを提供したい:ジェネリッククラスの入れ子になったジェネリック
class Foobar extends AbstractThing<Double>
class EventThing<Foobar> {
public Foobar getSource();
public Double getValue();
}
だから私はこの書き込み:
class EventThing<T extends AbstractThing<U>> {
public T getSource();
public U getValue();
}
をしかし、javaはU
を解決することはできません。
代わりにEventThing<T extends AbstractThing<U>,U>
で動作しますが、第2のU
は実際には冗長であるため、AbtractThingはすでにタイプを定義しています。だから私はそれを取り除くことが大好きです。
それはより多くのコンパイラの欠けている機能のように私には思えます。 編集: しかし、私はあなたのポイントを得る、あなたの答えに感謝します。 悪いです。私は穴の特徴を残しておくと思います。 –
@Marcel:私はこの答えは、なぜコンパイラが 'U'が実際の型かジェネリック型のパラメータかを推測しようとすることができない理由を説明していると思います。 Javaでは、各ジェネリック型パラメータを正当な理由で明示的に宣言する必要があります。それがあなたに似ているかどうかにかかわらず、これは「コンパイラの欠けている機能」ではありません。 – ColinD
@ColinD:私はMarcelには欠けているように見えますが、彼の例ではUは重複しているようです。明らかに、Uは型引数であることをコンパイラに知らせる必要がありますが、class EventThing>は基本的にUが可変型パラメータであることを示しています。議論の目的のためだけに、私はそれが醜いことに同意する)。この方法では、呼び出しコードに繰り返しはありません。 –
Gilead