我试图从Java中的Arraylist中删除一个元素,我收到一个错误
"Exception in thread "main" java.lang.ClassCastException: java.util.ArrayList$Itr cannot be cast to newpackage.Book";
这个错误的原因是什么,我该如何解决?
public void removeBook(){
int i=Integer.parseInt(JOptionPane.showInputDialog("Pleanse input isbn to be removed"));
Iterator b=books.iterator();
while(b.hasNext()){
if(i==((Book)b).ISBN)b.remove();
}
}
谢谢。
b
是一个Iterator
,而不是Book
。你应该打电话给b.next()
来获得当前的Book
。你应该使用参数化类型 - Iterator<Book>
- 以避免将当前元素强制转换为Book
。
public void removeBook() {
int i=Integer.parseInt(JOptionPane.showInputDialog("Pleanse input isbn to be removed"));
Iterator<Book> b=books.iterator();
while(b.hasNext()) {
if(i == b.next().ISBN)
b.remove();
}
}
另一个建议,而不是直接访问ISBN
属性,使用getter - getISBN()
。
将cast b.next()类型转换为Book类型对象,如下所示,然后进行比较。实际上这种情况正在发生,因为您试图将迭代器类型强制转换为预订类型
public void removeBook(){
int i=Integer.parseInt(JOptionPane.showInputDialog("Pleanse input isbn to be removed"));
Iterator b=books.iterator();
while(b.hasNext()){
Book b1=(Book) b.next();
if(i==(b1.ISBN)){
b.remove();
}
}
}
while循环中的代码不是很清楚,只需将Iterator对象强制转换为对象并将其删除即可
Iterator itr = books.iterator();
int i=Integer.parseInt(JOptionPane.showInputDialog("Please input isbn to be removed"));
Book Element = "";
while (itr.hasNext()) {
Element = (Book) itr.next();
if (Element.id == i) {
itr.remove();
break;
}
}
PS:您无法将Book对象与Integer'i'进行比较,如果'i'是要删除的书的id,则必须比较Book.id == i或String book name:Element.name .equals( “nameInput”)