gpt4 book ai didi

java - 无法将 ModuleInfo 对象添加到 ArrayList<?扩展模块信息>

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:30:03 26 4
gpt4 key购买 nike

我不确定我是否正确使用了泛型,但基本上我创建了一个 Arraylist<? extends ModuleInfo> moduleListModuleInfo 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

最佳答案

假设您创建一个数组列表:-

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

现在列表引用可以指向 ArrayList<Dog>ArrayList<Cat>管他呢。因此,当您尝试添加 Animal对该列表的引用,编译器不确定,该引用实际上指向相同的 implementation ArrayList 的实际混凝土类型中使用的.

例如:- 您可以添加 Animal引用指向 Cat进入上面的ArrayList,这是一场灾难。这就是编译器不允许的原因。

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 .

关于java - 无法将 ModuleInfo 对象添加到 ArrayList<?扩展模块信息>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13499928/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com