2012-11-21 17 views
2

我不確定如果我正確使用泛型,但基本上我創建了一個Arraylist<? extends ModuleInfo> moduleListModuleInfo m對象,並試圖呼叫moduleList.add(m)。但它不會編譯,我收到一條對我來說似乎有點神祕的錯誤消息。錯誤消息和代碼如下。其他人知道什麼是錯的?無法將一個ModuleInfo對象添加到ArrayList <?擴展ModuleInfo>

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 
+0

你聲明moduleList的類型是'ArrayList <?擴展ModuleInfo>'但是當你構造新的ArrayList時,沒有類型。它不應該是'新的ArrayList <?擴展ModuleInfo>();' – dashrb

+0

我將聲明更改爲'ArrayList ',它工作正常。我很困惑,並認爲它需要這樣,因爲從Lookup對象返回的Collection是'Collection <?擴展ModuleInfo>'。 – user1842941

回答

10

假設你創建一個ArrayList爲: -

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

現在列表引用可以指向一個ArrayList<Dog>ArrayList<Cat>或什麼的。因此,當您嘗試將Animal引用添加到該列表時,編譯器不確定該引用實際上是否指向implementation,該實際的具體類型爲ArrayList

例如: - 您可能會將指向CatAnimal引用添加到上述ArrayList中,這是一場災難。這就是Compiler不允許的原因。

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

+0

非常感謝,我覺得自己像個白癡一樣想念那個。 – user1842941

1

要解決您的問題用途:

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

這會限制你的列表,以ModuleInfo實例,以及它們的子類。