Объясните это общее поведение в JAVA - PullRequest
0 голосов
/ 02 июля 2018
public class MyList<Item> implements Iterable<Item> {
    Node<Item> first;
    int n = 0;

    private static class Node<Item>
    {
        private Item item;
        private Node<Item> next;
    }
    public Iterator<Item> iterator()  {
        return new ListIterator<Item>();
    }

    private class ListIterator<Item> implements Iterator<Item>  // parameter Item is hiding the type Item
    {
        private Node<Item> current = first;  // This does not compile

        public boolean hasNext() {
            return (current != null);   
        }

        public Item next() {
            Item item = current.item;
            current = current.next;
            return current.item;
        }       
    }
    ...
}

Я получаю ошибку

"Несоответствие типов: невозможно преобразовать из MyList.Node в MyList.Node».

Не уверен, связано ли это с предупреждением

"Paramter Item скрывает тип элемента"

Если я получаю предупреждение для private class ListIterator<Item> implements Iterator<Item>, почему я не получаю предупреждение для public class MyList<Item> implements Iterable<Item>?

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Предупреждение очень связано. Ваш параметр универсального типа в вашем внутреннем классе скрывает параметр универсального типа во внешнем классе. Так что Item в каждой области не одинаковы, поэтому два разных Node<Item> на самом деле являются разными типами.

См. Также: Устранение неисправностей «Параметр типа T скрывает тип T» предупреждение

Ответ Эрана показывает, как это исправить, поэтому я не буду повторять это.

0 голосов
/ 02 июля 2018

Если параметр универсального типа внутреннего класса ListIterator должен совпадать с параметром типа включающего класса MyList, вы не должны объявлять его дважды.

Изменить внутренний класс на:

private class ListIterator implements Iterator<Item>

Таким образом, типы first и current будут одинаковыми.

Как прокомментировал Майкл, вам придется изменить конструкцию экземпляра ListIterator на:

public Iterator<Item> iterator()  {
    return new ListIterator();
}
...