0

私はインターフェースを持っています

interface Inter extends Blah {
   public void someMethod();
}

class Dummy {
  Class<Blah> interfaceType;

  public setInterfaceType( Class<Blah> input ) {
    this.interfaceType = input;
  }  
}

class tester {
  public void init() {
    Dummy dummyObj = new DummyObj();
    dummyObj.setInterfaceType( Inter.class );     //This complains that the type is not suitable
  }
}

コンパイル エラー:

Dummy 型のメソッド setInterfaceType(Class) は、引数 (Class) には適用されません。

セッターを呼び出しながらキャストしようとinputしましClass<Blah>たが、それも許可されていません。サブクラスタイプのクラスを受け入れない理由がわかりません。ここで何が起こっているのか、セッターを呼び出す方法を教えてください。クラスは外部なので、Dummy変更できません。

4

2 に答える 2

3

ジェネリックは共変ではないClass<Blah>ため、 type の object に設定することはできませんClass<Inter>。考えてみてください。使用できる場合は、リンゴだけでなく他の果物も追加できますList<Fruit> list = new ArrayList<Apple>()listそれでいいでしょうか?

この問題を解決するには、次のように変更Class<Blah>してみてくださいClass<? extends Blah>

Dummyジェネリック型を使用するようにクラスを変更することもできますT

class class Dummy<T extends Blah> {
    Class<T> interfaceType;

    public void setInterfaceType(Class<T> input) {
        this.interfaceType = input;
    }
}

そしてそれを次のように使用します

Dummy<Inter> dummyObj = new Dummy();
dummyObj.setInterfaceType(Inter.class);
于 2013-10-17T02:30:03.513 に答える
0

あなたは間違いなく意味します

Class<? extends Blah> interfaceType;

public setInterfaceType( Class<? extends Blah> input ) {
    this.interfaceType = input;
}  

アップデート

Dummy クラスを変更できない場合、なぜそのようなセッター メソッドがあるのか​​、かなり疑問です。とにかく、次のように引数を Class にキャストすることにより (型引数なしで)、「ジェネリック型」チェックを回避できます。

于 2013-10-17T02:31:42.553 に答える