2015-10-09 4 views
0

Это ошибка, что я получаю:ClassCastException: ArrayList не может быть приведен к

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

Я пытался испортить это, но мне не повезло. Любые советы приветствуются.

+0

menuComponent - это ArrayList, поэтому вы не можете отнести его в свой класс MenuComponents - два метода, называемых add & remove, должны иметь '(menuComponent)' вместо '(menuComponents)' –

ответ

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

Проблема ист добавить ArrayLists в вашем Arraylist в этой точке

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

он должен быть

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

вы можете просто избежать это используя типизированный Arraylist вот так ArrayList<MenuComponent> menuComponents = new ArrayList<>();

2

Недостаток использования необработанного типа ArrayList, вы не заметите, если совершите простую ошибку. Вы должны скорее объявить ArrayList как ArrayList<MenuComponent> menuComponents. Тогда вы заметили бы, что в вашем методе add(MenuComponent menuComponent) вы всегда добавляете массивList в массивList, потому что вы сделали простую опечатку.

Это должно быть menuComponents.add(menuComponent); вместо menuComponents.add(menuComponents);. Такая же проблема будет возникать в вашем методе удаления.

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 знает, что вы делаете не то, и можете сказать вам.

Смежные вопросы