ArrayList中Person对象无法被方法识别为对应类型的问题求助
解决ArrayList作为参数时的类型不匹配编译错误
错误原因
你遇到的编译错误核心是原始类型ArrayList导致的类型擦除问题:在Person类的getEvent方法中,参数ArrayList list未指定泛型类型,编译器会将其视为存储Object的集合。调用list.get(place+1)时返回的是Object类型,但Events.groupEvent方法要求传入Person类型参数,因此触发类型不匹配报错。
修复方案
1. 给ArrayList参数添加泛型约束
修改Person类中getEvent方法的参数签名,明确指定ArrayList的元素类型为Person:
// 原方法签名 // public void getEvent(Person self, ArrayList list, int place) // 修改后 public void getEvent(Person self, ArrayList<Person> list, int place)
这样编译器会识别集合中的元素为Person类型,list.get()会直接返回Person,无需额外转换即可传入groupEvent方法。
2. 额外优化:移除冗余的self参数
在Person类的成员方法中,self参数完全可以用this代替,减少冗余代码:
修改后的getEvent方法:
public void getEvent(ArrayList<Person> list, int place){ Random rand = new Random(); int determiner = rand.nextInt(10); switch(determiner){ case 1: case 2: case 3: case 4: case 5: Events.fillerEvent(this); break; case 6: case 7: case 8: if (place != list.size()-1){ Events.groupEvent(this, list.get(place+1)); }else{ Events.fillerEvent(this); } break; case 9: case 10: Events.fatalEvent(this); break; default: break; } alreadyActed = true; }
同时调整LifeSimulator中的调用代码,移除多余的self参数:
// 原调用 // pList.get(i).getEvent(pList.get(i), pList, i); // 修改后 pList.get(i).getEvent(pList, i);
3. 性能优化:复用Random对象
避免在getEvent方法中每次调用都新建Random实例,可将其声明为Person类的静态成员变量:
public class Person { // 添加静态Random实例 private static final Random rand = new Random(); // ...其他成员变量 public void getEvent(ArrayList<Person> list, int place){ int determiner = rand.nextInt(10); // ...后续逻辑 } }
结论
这种用法本身完全可行,问题仅出在未正确使用泛型约束集合类型。通过给ArrayList添加<Person>泛型声明,即可解决编译错误,同时优化代码冗余问题。
内容的提问来源于stack exchange,提问作者Naplock Blubba
相关产品推荐
相关产品推荐

