2013-12-03 5 views
1

Поэтому для моего назначения требуется, чтобы я реализовал интерфейс в одном из моих классов. Интерфейс - это общий Итератор, который должен будет переопределить методы hasNext() и next(). Я получаю сообщение об ошибке, когда пытаюсь назначить итератор экземпляра ArrayList экземпляру Iterator.Проблема присвоения итератора Java

Вот мой интерфейс:

public interface Iterator <E> 
{ 
    boolean hasNext(); 
    E next(); 
    void remove(); 
}// end Iterator interface 

А вот класс, который реализует этот интерфейс:

import java.util.*; 
import java.io.*; 

public class WordDatabase implements Iterator<String> 
{ 
// Declaration 
private List<String> aList; 
private Iterator<String> aListIterator; 

    /**** Other Class Methods Here *****/ 

@SuppressWarnings("unchecked") 
public void shuffle() 
{ 
    // Declaration 
    int rand; 
    String temp; 

    // Statement 
    // shuffling ArrayList 
    for(int i = 0; i < getAlist(); i++) 
    { 
     rand = (int)(Math.random() * getAlist() - 1); 

     // swapping two ArrayList entry 

     temp = aList.get(i); 
     aList.remove(i); 
     aList.add(i, aList.get(rand)); 
     aList.remove(rand); 
     aList.add(rand, temp); 
    } 

    aListIterator = aList.iterator(); 

    return; 
}// end shuffle method 

Eclipse, говорит мне, что я должен бросить aList.iterator() к Iterator<String>, но при этом выдает ошибку java.util.AbstractList$Itr cannot be cast to Iterator. Может кто-нибудь помочь мне понять эту проблему?

+1

Когда вы говорите «Вот мой интерфейс», вы имеете в виду здесь образец java.util.Interator? Или у вас есть собственное объявление интерфейса Iterator в вашем собственном пакете? Если у вас есть собственный интерфейс Iterator, это вызовет проблемы. – AgilePro

+0

@AgilePro Да, у меня есть собственный интерфейс итератора. – Nathan

ответ

0

Вы не можете этого сделать, поскольку оба объекта Iterator принадлежат к различным пакетам.

Вы должны определить свой собственный интерфейс List так же, как и для Iterator; Определите метод iterator(), который возвращает объект вашего интерфейса Iterator.

+0

Хм, я вижу. Возможно, я мог бы неправильно истолковать задание. Поскольку мой учитель сказал бы нам, что нам нужен отдельный интерфейс для List. Сейчас я отправлю письмо своему профессору для разъяснения. Благодарю. – Nathan

0

Что я понял из исключения Вы определили свой собственный интерфейс в Итераторе так что теперь не было бы никакого отношения со списком. Так что вы не можете бросить.

0

Метод java.util.List.iterator возвращает экземпляр java.util.Iterator, а не ваш интерфейс my.special.Iterator. Но вы указали переменную как интерфейс my.special.Iterator. Хотя у них одно и то же простое имя, они на самом деле разные типы, и Eclipse хочет, чтобы вы его бросили, чего не можете, потому что они не связаны.

Вам также понадобится реализовать собственный класс List или избежать использования метода iterator.

+0

Да, пара других людей сказала то же самое. Я просто по электронной почте моего профессора об этом. Возможно, я неверно истолковал, что она имела в виду, потому что она на самом деле показала нам интерфейс и сказала, что использует этот интерфейс. Это тот, который я опубликовал выше. – Nathan

+0

Перечисленный вами интерфейс идентичен 'java.util.Iterator', поэтому вы можете просто использовать' java.util.Iterator' для выполнения задания и выбросить копию для решения проблемы. Если этот ответ был полезен, проверьте его как принятый ответ (небольшая галочка слева.) – AgilePro

0

Iterator<String> aListIterator - это ваш интерфейс итератора, итератор, возвращаемый aList.iterator();, является java.util.Iterator.

Названия такие же, но пакеты разные (я полагаю, что). Поэтому вы не можете их бросить. Но чтобы на самом деле перебирать список с помощью вашего итератора, вам нужно расширить список и реализовать свой итератор внутри него. это то, что пытается сделать ваш класс WordDatabase. попробуйте использовать массив в своем классе вместо списка.

+0

Спасибо за ответ, но на самом деле я не могу использовать массивы. – Nathan

+0

Вы не указали на реализацию своего собственного интерфейса итератора. Можете ли вы добавить их тоже? – Nazgul

+0

Я просто переопределял методы, перечисленные выше, на требование о домашнем задании. У меня не было возможности переопределить их, из-за ошибки, которую я получал. Сожалею. – Nathan

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