ジェネリックに関連するサブタイピング/インターフェース実装の背後にある概念を理解できません。説明してください。私は以下の構造を持っていました:
`ICommand -> ProducerConsumerCommand`
IProducerConsumer -> SimpleProducerConsumer
私の理解では、IProducerConsumer を実装する具象クラスは、Number および ICommand インターフェイスのサブクラスである T 型のオブジェクトを保持する必要があります。
IProducerConsumer<T extends Number,ICommand>
次に、実装クラス SimpleProducerConsumer を書きたいと思います。
ここでの意図は、SimpleProducerConsumer が、以下のように IProducerConsumer 型パラメーターで定義されている任意の型パラメーターを保持できることを伝えたいということです。
public class SimpleProducerConsumer<T,ICommand> implements Runnable,
IProducerConsumer<T,ICommand> {
それは機能しません、それは以下のように言います:
SimpleProducerConsumer<T,ICommand> - ICommand complains (warning) that it is getting hidden.
IProducerConsumer<T,ICommand> - compiler errors in T saying as below
*境界の不一致: 型 T は、型の境界付きパラメーターの有効な代替ではありませんIProducerConsumer<T,ICommand>*
それで、私の最初の質問は、具象クラスのインターフェイスと同じように定義できないのはなぜですか。ボンネットの下で何が起こっているのか。
定義できれば
public class test<ICommand> {}
なぜ私は実装中に同じことができないのか、混乱しています。
今、私は以下のように定義します
public class SimpleProducerConsumer<T,ProducerConsumerCommand> implements Runnable,
IProducerConsumer<T,ICommand> {
それでも IProducerConsumer の T は文句を言います。
以下のように変更した場合:
public class SimpleProducerConsumer<T,ProducerConsumerCommand> implements Runnable,
IProducerConsumer<T extends Number,ICommand> {
extends は、トークンを削除するように言って文句を言います。
今、私は以下のようにこれを好きです:
public class SimpleProducerConsumer<T extends Number,ProducerConsumerCommand> implements Runnable,
IProducerConsumer<T extends Number,ICommand> {
IProducerConsumer で拡張しても機能しません。
今
public class SimpleProducerConsumer<T extends Number,ProducerConsumerCommand> implements Runnable,
IProducerConsumer<T,ICommand> {
はい、コンパイラは満足しています。今、私は完全に迷っています。上記のことはどういう意味ですか。SimpleProducerConsumer には Number のサブクラスであるタイプ T のオブジェクトが含まれており、ProducerCommand オブジェクトは理にかなっていますが、IProducerConsumer はタイプ T のオブジェクトを保持していますか??? これは何ですか ?
この背後にある理論的根拠は何ですか。誰か説明してください。