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对该列表的引用时,编译器不确定该引用实际上指向与implementation实际具体类型中使用的相同ArrayList

例如: - 您可能会在上面的 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 回答