1

ジェネリックに関連するサブタイピング/インターフェース実装の背後にある概念を理解できません。説明してください。私は以下の構造を持っていました:

`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 のオブジェクトを保持していますか??? これは何ですか ?

この背後にある理論的根拠は何ですか。誰か説明してください。

4

1 に答える 1

1

ここには 2 つの問題があります。

  1. で宣言されているようにIProducerConsumer<T extends Number,ICommand>ICommandはインターフェイスを参照していませんICommandが、代わりに のような別のジェネリック型パラメーター宣言ですT。したがって、このジェネリック型パラメーターがICommandインターフェイスを隠しているという警告が表示されます。IProducerConsumer次のように宣言する必要があります。

    public interface IProducerConsumer<N extends Number, C extends ICommand>
    
  2. インターフェイスで必要とされるように、必ずしも extends ではないため、 Bound mismatchfor を取得します。これを修正するには、 like を次のように宣言する必要があります。TTNumberIProducerConsumerSimpleProducerConsumer

    public class SimpleProducerConsumer<N extends Number, C extends ICommand> implements Runnable, IProducerConsumer<N,C>
    
于 2014-04-02T06:55:18.753 に答える