use*_*941 3 java generics netbeans
我不确定我是否正确使用泛型,但基本上我创建了一个Arraylist<? extends ModuleInfo> moduleList和ModuleInfo 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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
错误如下:
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
Run Code Online (Sandbox Code Playgroud)
Roh*_*ain 12
假设您创建了一个arraylist: -
List<? extends Animal> list = new ArrayList<Dog>();
Run Code Online (Sandbox Code Playgroud)
现在列表引用可以指向一个ArrayList<Dog>或一个ArrayList<Cat>或其他什么.因此,当您尝试添加Animal对该列表的引用时,编译器不确定该引用实际上指向的implementation是实际的Concrete类型中使用的引用ArrayList.
例如: - 您可以添加一个Animal指向Cat上面ArrayList 的引用,这是一个灾难.这就是编译器不允许的原因.
Animal cat = new Cat();
list.add(cat); // OOps.. You just put a Cat in a list of Dog
Run Code Online (Sandbox Code Playgroud)
你可以只创建一个List<Animal>,你可以添加任何子类型: -
List<Animal> newList = new ArrayList<Animal>();
newList.add(new Cat()); // Ok. Can add a `Cat` to an `Animal` list.
Run Code Online (Sandbox Code Playgroud)
上面的代码有效,因为List<Animal>引用只能指向一个ArrayList<Animal>.
因此,在您的示例中,您可以使用: -
List<ModuleInfo> list = new ArrayList<ModuloInfo>();
Run Code Online (Sandbox Code Playgroud)
作为旁注,你应该总是编程interface而不是implementation.所以,总是有你的引用类型interface,在这种情况下List而不是ArrayList.
| 归档时间: |
|
| 查看次数: |
1871 次 |
| 最近记录: |