3

ジェネリックを正しく使用しているかどうかはわかりませんが、基本的にArraylist<? extends ModuleInfo> moduleListandModuleInfo mオブジェクトを作成し、 を呼び出してみましたmoduleList.add(m)。ただし、コンパイルされず、少し不可解なエラーメッセージが表示されます。エラーメッセージとコードは以下です。他に何が悪いのか知っている人はいますか?

void load() {
    ArrayList<? extends ModuleInfo> moduleList = new ArrayList();
    Iterator<? extends ModuleInfo> iter_m;
    ModuleInfo m;

    //get modules that depend on this module
    //retrieve list of all modules and iterate trough each one
    iter_m = Lookup.getDefault().lookupAll(ModuleInfo.class).iterator();
    while(iter_m.hasNext()) {
        m = iter_m.next();
        //loop through modules dependencies and check for a dependency on this module
        for(Dependency d : m.getDependencies()) {
            //if found, the module to the list
            if(d.getName().equals(GmailAuthManager.class.getPackage().getName())) {
                moduleList.add(m);
                break;
            }
        }
    }
}

エラーは次のとおりです。

error: no suitable method found for add(ModuleInfo)
                    moduleList.add(m);
    method ArrayList.add(int,CAP#1) is not applicable
      (actual and formal argument lists differ in length)
    method ArrayList.add(CAP#1) is not applicable
      (actual argument ModuleInfo cannot be converted to CAP#1 by method invocation conversion)
  where CAP#1 is a fresh type-variable:
    CAP#1 extends ModuleInfo from capture of ? extends ModuleInfo
4

2 に答える 2

12

配列リストを次のように作成するとします: -

List<? extends Animal> list = new ArrayList<Dog>();

ArrayList<Dog>これで、そのリスト参照は、またはを指すことができますArrayList<Cat>。そのため、そのリストへの参照を追加しようとすると、コンパイラはその参照が実際に の実際の具象型で使用されているものAnimalと同じものを実際に指していることを確認できません。implementationArrayList

例: -上記の ArrayList をAnimal指す参照を追加する可能性がありますが、これは惨事です。Catそのため、コンパイラはそれを許可しません。

Animal cat = new Cat();
list.add(cat);  // OOps.. You just put a Cat in a list of Dog

を作成するだけでList<Animal>、任意のサブタイプを追加できます: -

List<Animal> newList = new ArrayList<Animal>();
newList.add(new Cat());  // Ok. Can add a `Cat` to an `Animal` list.

上記のコードが機能するのは、List<Animal>参照が指すことができるのはArrayList<Animal>.


したがって、あなたの例では、次を使用できます。

List<ModuleInfo> list = new ArrayList<ModuloInfo>();

補足として、常にinterfaceではなくにプログラムする必要がありますimplementation。したがって、interfaceこの場合Listは ではなくの参照型を常に使用してくださいArrayList

于 2012-11-21T18:44:41.163 に答える
1

問題を解決するには、次を使用します。

ArrayList<ModuleInfo> moduleList = new ArrayList<ModuleInfo>();

これにより、リストが ModuleInfo インスタンスとそのサブクラスに制限されます。

于 2012-11-21T18:49:25.513 に答える