2015-02-04 2 views
2

Я создаю свою собственную коллекцию класс, реализующий интерфейс Iterable на Java. Тем не менее, я получаю ошибку компиляции, говоря:Ошибка компиляции Java Generics: несовместимые типы: Item # 1 не может быть преобразован в Item # 2

Nikolass-MacBook-Pro:week2 nburk$ javac Deque.java 

Deque.java:115: error: incompatible types: Item#1 cannot be converted to Item#2 
     Item currentItem = current.item; 
           ^
    where Item#1,Item#2 are type-variables: 
    Item#1 extends Object declared in class Deque 
    Item#2 extends Object declared in class Deque.DequeIterator 
1 error 

Ниже приведены соответствующие части моего кода:

public class Deque<Item> implements Iterable<Item> { 

    // return an iterator over items in order from front to end 
    public Iterator<Item> iterator() { 
     return new DequeIterator<Item>(); 
    } 

    private class DequeIterator<Item> implements Iterator<Item> { 

     public DequeIterator() { 

     } 

     public Item next() { 
     Item currentItem = current.item; // this line causes the ERROR 
     current = current.next; 
     return currentItem; 
     } 
    } 
} 

Я считаю, что вопрос несколько связано с тем, что я использую генерики в неправильный путь, и мое объявление Item может быть неправильным. Тем не менее, я сравнивал свою реализацию с this quick tutorial и не вижу различий, которые могут вызвать проблему на моей стороне. Кто-нибудь, чего мне не хватает, и как я могу избавиться от ошибки?

ответ

7

В

private class DequeIterator<Item> implements Iterator<Item> { 
    public DequeIterator() { 
    } 
} 

вы объявить новую переменную типа под названием Item. Вы не используете одно из них с Deque<Item>. Это могут быть разные типы. Вместо этого, чтобы избавиться от объявления параметра

private class DequeIterator implements Iterator<Item> { 

Предположительно, current.item является ссылкой на объект типа Item, объявленном в Deque, но вы пытаетесь присвоить переменный типа Item, объявленного в DequeIterator.


Вам также необходимо удалить параметризации DequeIterator, поскольку он не является универсальным больше. Так, например

return new DequeIterator<Item>(); 

изменения

return new DequeIterator(); 
+0

спасибо за быстрый ответ! удаление '' дает мне еще одну ошибку компиляции: 'Deque.DequeIterator не принимает параметры return new DequeIterator ();' – nburk

+1

@nburk О да, удалите любую параметризацию 'DequeIterator'. –

+1

ha! компилирует! большое спасибо!! – nburk

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

  • Нет связанных вопросов^_^