[英]ClassCastException: ArrayList cannot be cast to
這是我得到的錯誤:
java.lang.ClassCastException: java.util.ArrayList cannot be cast to MenuComponent
這是引起我麻煩的代碼:
import java.util.ArrayList;
import java.util.Iterator;
public class Menu extends MenuComponent{
ArrayList menuComponents = new ArrayList();
String name;
String description;
public Menu() {
}
public Menu(String name, String description) {
super();
this.name = name;
this.description = description;
}
public void add(MenuComponent menuComponent) {
menuComponents.add(menuComponents);
}
public void remove(MenuComponent menuComponent) {
menuComponents.remove(menuComponents);
}
public MenuComponent getChild(int i) {
return (MenuComponent) menuComponents.get(i);
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public void print() {
System.out.println(getName());
System.out.print("---" + getDescription());
System.out.println("---");
Iterator iterator = menuComponents.iterator();
while(iterator.hasNext()) {
MenuComponent menuComponent = (MenuComponent) iterator.next();
menuComponent.print();
}
}
public Iterator createIterator() {
return new CompositeIterator(menuComponents.iterator());
}
}
導致錯誤的問題在此行中:
MenuComponent menuComponent = (MenuComponent) iterator.next();
我試過弄亂它,但是沒有運氣。 任何提示,不勝感激。
那是使用ArrayList
的原始類型的缺點,如果您犯了一個簡單的錯誤,您將不會注意到。 您應該將ArrayList
聲明為ArrayList<MenuComponent> menuComponents
。 然后您會注意到,在方法add(MenuComponent menuComponent)
您總是將arrayList添加到arrayList中,因為您做了一個簡單的錯字。
它應該是menuComponents.add(menuComponent);
而不是menuComponents.add(menuComponents);
。 您的刪除方法中也會發生相同的問題。
問題在這里:
public void add(MenuComponent menuComponent) {
menuComponents.add(menuComponents);//you add menuComponentS to the list!
}
public void remove(MenuComponent menuComponent) {
menuComponents.remove(menuComponents);//you remove menuComponentS to the list!
}
問題是此時您將Arraylist添加到Arraylist中
public void add(MenuComponent menuComponent) {
menuComponents.add(menuComponents);
}
它一定要是
public void add(MenuComponent menuComponent) {
menuComponents.add(menuComponent);
}
您可以通過使用像這樣的ArrayList<MenuComponent> menuComponents = new ArrayList<>();
來簡單地避免這種情況ArrayList<MenuComponent> menuComponents = new ArrayList<>();
首先,不要使用原始集合,例如:
ArrayList menuComponents = new ArrayList();
正確的方法是這樣的:
ArrayList<MenuComponent> menuComponents = new ArrayList<MenuComponent>();
或更好:
List<MenuComponent> menuComponents = new ArrayList<MenuComponent>();
這樣就可以消除類型轉換,如下所示:
return (MenuComponent) menuComponents.get(i);
而是這樣做:
return menuComponents.get(i);
這將允許Java告訴您是否在數組中粘貼了錯誤的內容,如下所示:
menuComponents.add(menuComponents);
Java讓您擺脫了menuComponents
因為它不知道menuComponents
應該包含什么。 當您說new ArrayList<MenuComponent>()
,您在告訴Java ArrayList
中只能包含MenuComponent
對象。 然后,以上代碼將無法編譯,因為Java知道您做錯了事並且可以告訴您。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.