ClassCastException:ArrayList无法强制转换为

时间:2015-10-09 10:35:46

标签: java arraylist iterator

这是我得到的错误:

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();

我试过弄它,但我没有运气。任何提示都非常感谢。

4 个答案:

答案 0 :(得分:2)

使用ArrayList的原始类型的缺点是,如果你犯了一个简单的错误就不会注意到。您应该将ArrayList声明为ArrayList<MenuComponent> menuComponents。然后你会注意到,在你的方法add(MenuComponent menuComponent)中你总是将arrayList添加到arrayList中,因为你做了一个简单的拼写错误。

应该是menuComponents.add(menuComponent);而不是menuComponents.add(menuComponents);。您的删除方法也会出现同样的问题。

答案 1 :(得分:1)

问题在于:

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!
}

答案 2 :(得分:0)

问题是你现在在Arraylist中添加了Arraylists

public void add(MenuComponent menuComponent) {
    menuComponents.add(menuComponents);
}

必须是

public void add(MenuComponent menuComponent) {
    menuComponents.add(menuComponent);
}

你可以通过使用像ArrayList<MenuComponent> menuComponents = new ArrayList<>();

这样的类型化的Arraylist来避免这种情况

答案 3 :(得分:0)

首先,不要使用原始集合,如下所示:

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所谓的是什么。当你说new ArrayList<MenuComponent>()时,你告诉Java ArrayList只能有MenuComponent个对象。然后,上面的代码将无法编译,因为Java知道你做错了什么并且可以告诉你。