簡體   English   中英

ClassCastException:無法將ArrayList強制轉換為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM