我想为messfood()
随机选择一名学生。试图在那里打印学生姓名。每个星期,任何一个学生都应该被选中进行食物收费。试过String random = list.get(new Random().nextInt(list.size()));
。但显示错误。帮助我。
public class Student {
int rollNo, yearOfStudy;
String fName, lName, activity;
Student(int rollNo, String fName, String lName, int yearOfStudy) {
this.rollNo = rollNo;
this.fName = fName;
this.lName = lName;
this.yearOfStudy = yearOfStudy;
}
public void display(){
System.out.println("Roll Number: "+rollNo +"\nName: "+fName+ " "+lName + "\nYear Of Study: "+yearOfStudy+"\n\n");
}
public void messFood(){
System.out.println("week 1, Mess food Incharge: ");
}
}
class Collection {
public static void main(String[] args) {
Student s1 = new Student(1, "Alex", "Iwobi", 2013);
Student s2 = new Student(2, "Denis", "Suarez", 2013);
Student s3 = new Student(3, "Gerard", "Deulofeu", 2013);
Student s4 = new Student(4, "Petr", "Cech", 2013);
List studentList = new ArrayList();
studentList.add(s1);
studentList.add(s2);
studentList.add(s3);
studentList.add(s4);
Iterator it = studentList.iterator();
while(it.hasNext()){
Student s=(Student)it.next();
s.display();
}
}
}
答案 0 :(得分:1)
这正是您应该使用泛型的原因!您可能会遇到涉及预期和实际类型的运行时错误(与编译时错误相反)。
如果未使用泛型,您对list.get()
的调用将返回Object
,因此需要您进行投射。如果演员碰巧是错误,就像你的情况一样,它只会在运行时爆炸。如果您使用泛型,您的编译器会告诉您,您无法将Student
类型转换为String
类型!
看看我的版本:
public class Student {
int rollNo, yearOfStudy;
String fName, lName, activity;
public Student(int rollNo, String fName, String lName, int yearOfStudy) {
this.rollNo = rollNo;
this.fName = fName;
this.lName = lName;
this.yearOfStudy = yearOfStudy;
}
@Override
public String toString() {
return new StringBuilder()
.append("Roll Number: ").append(rollNo)
.append("\nName: ").append(fName).append(" ").append(lName)
.append("\nYear Of Study: ").append(yearOfStudy)
.append("\n\n")
.toString();
}
public void messFood() {
// Establish mess food charge role
}
public static void main(String[] args) {
Student s1 = new Student(1, "Alex", "Iwobi", 2013);
Student s2 = new Student(2, "Denis", "Suarez", 2013);
Student s3 = new Student(3, "Gerard", "Deulofeu", 2013);
Student s4 = new Student(4, "Petr", "Cech", 2013);
List<Student> studentList = new ArrayList<Student>();
studentList.add(s1);
studentList.add(s2);
studentList.add(s3);
studentList.add(s4);
Iterator<Student> it = studentList.iterator();
while (it.hasNext()) {
Student s = it.next();
System.out.println(s.toString());
}
Student randomStudent = getRandomItem(studentList);
randomStudent.messFood();
System.out.println("week 1, Mess food Incharge: ");
System.out.println(randomStudent.toString());
}
private static <T> T getRandomItem(List<T> studentList) {
return studentList.get(new Random().nextInt(studentList.size()));
}
}
另外,除了泛型之外,我还添加了几个最佳实践,即更喜欢使用toString()
来描述类而不是直接打印出来(你可以使用String
无论如何你想要的,包括调用System.out.println()
)。
此外,我从messFood
移出了打印,因为再一次,通常最好这样做。希望有所帮助!
修改:简要描述getRandomItem
,尽量不要过于关注细节,但<T>
表示会有替换{{1}的类型根据它的调用方式。根据它的定义方式,它会说如果您传递T
包含类型List
,我会返回一个对象T
。在这种情况下,T
转换为T
,但我保持通用,因为它与其他列表同样有效。对于所有意图和目的,就好像签名如下:
Student
答案 1 :(得分:0)
list.get()
将返回一个学生对象,而不是一个字符串,假设它是一个学生列表。
你应该做
Student random = list.get(new Random().nextInt(list.size()));
System.out.println(random.getFname + " " + random.getLname);
但当然你需要定义get方法。