(如果我误用了任何术语,我道歉,我不是词汇最好的)我正在尝试编写一个程序,它迭代Person对象列表,并从随机列表中输出一个事件。对于只涉及一个Person的事件,它工作得很好,但对于多个Person,我在实现一个好的方法时遇到了麻烦。我已经通过手动从主文件调用Event方法使其工作。但这非常笨拙,而且很难在以后扩展,我想到了使用ArrayList和迭代作为实参参数的一部分的想法,因为这样更干净,更容易在以后扩展,但我遇到了一个奇怪的错误,我不知道如何修复。
这是我正在处理的三个文件。
import java.util.*;
public class LifeSimulator {
public static void main(String[] args) {
String P1Name = "P1";
String P2Name = "P2";
String P3Name = "P3";
String P4Name = "P4";
String P5Name = "P5";
String P6Name = "P6";
ArrayList<Person> pList = new ArrayList<Person>();
Person P1 = new Person(P1Name);
Person P2 = new Person(P2Name);
Person P3 = new Person(P3Name);
Person P4 = new Person(P4Name);
Person P5 = new Person(P5Name);
Person P6 = new Person(P6Name);
pList.add(P1);
pList.add(P2);
pList.add(P3);
pList.add(P4);
pList.add(P5);
pList.add(P6);
for(int s = 1; s <= 3; s++){
System.out.println("Session 1, Section " + s);
Collections.shuffle(pList);
for(int i = 0; i < pList.size(); i++){
if (pList.get(i).alreadyActed == false){
pList.get(i).getEvent(pList.get(i), pList, i);
}
}
for(int i = 0; i < pList.size(); i++){
if(pList.get(i).alive == false){
System.out.println(pList.get(i).getName() + " - DEAD");
pList.remove(i);
i--;
}else{
pList.get(i).refresh();
}
}
}
}
}
import java.util.*;
public class Person {
private int lives;
private String name;
public boolean alive;
public boolean alreadyActed;
public Person(String name){
this.name = name;
lives = 3;
alive = true;
alreadyActed = false;
}
public String getName(){return name;}
public int getLives(){return lives;}
public void loseLife(){
lives -= 1;
if (lives == 0){
System.out.println(name + " has lost their final life and is now dead!");
alive = false;}
}
public void refresh(){
alreadyActed = false;
}
public void getEvent(Person self, ArrayList 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(self);
break;
case 6:
case 7:
case 8:
if (place != list.size()-1){
Events.groupEvent(self, list.get(place+1));
}else{
Events.fillerEvent(self);
}
break;
case 9:
case 10:
Events.fatalEvent(self);
default:
}
alreadyActed = true;
}
}
import java.util.Random;
public class Events {
static Random rand = new Random();
public static void fillerEvent(Person p){
switch(rand.nextInt(2)){
case 0:
System.out.println(p.getName() + " works.");
break;
case 1:
System.out.println(p.getName() + " crafts.");
break;
}
}
public static void groupEvent(Person p1, Person p2){
switch(rand.nextInt(2)){
case 0:
System.out.println(p1.getName() + " helps " + p2.getName() + ".");
break;
case 1:
System.out.println(p1.getName() + " chats with " + p2.getName() + ".");
break;
}
}
public static void fatalEvent(Person p){
switch(rand.nextInt(2)){
case 0:
System.out.println(p.getName() + " died.");
death(p);
break;
case 1:
System.out.println(p.getName() + " died.");
death(p);
}
}
public static void death(Person p){
p.loseLife();
if(p.alive){
System.out.println(p.getName() + " has " + p.getLives() + " lives left.");
}
}
}
每当我尝试运行代码时,当它尝试调用[Events.groupEvent(self,list.get(place+1))]时,它都会抛出以下错误:
Exception has occurred: java.lang.Error
"java.lang.Error: Unresolved compilation problem:
The method groupEvent(Person, Person) in the type Events is not applicable for the arguments (Person, Object)
"
ArrayList包含Person对象,至少在主文件中是这样,所以我不知道为什么它只是把它们当作泛型对象,当把列表作为参数使用时,我是做错了什么,还是你不能用ArrayList做这件事?
2条答案
按热度按时间lp0sw83n1#
你宣称:
但是该方法丢失了Type:
您必须在声明中保留Type,否则它将丢失并成为推断的
ArrayList<Object> list
:vngu2lb82#
这是因为
list
基本上是Object
的列表。由于类型擦除,实际上意味着
ArrayList<Object>
。您可以将此参数更改为
或显式强制转换变量:
阅读详情: