Ошибка несоответствия типов при назначении переменной для объекта того же типа - PullRequest
0 голосов
/ 31 марта 2019

Я работаю над Итератором для класса связанного списка. Я присваиваю узлы переменным внутри класса и получаю ошибку «Несоответствие типов». Соответствующий код ниже.

public class RegLinkList<T> implements Iterable<T>{
    private Node<T> head;
public RegLinkList() {
        head = null;
    }   
 public class Node<T> {
   public Node<T> next = null;
   public T data = null;

   Node(T data){
        this.data = data;
    }
  }
    public class ListIterator<T> implements Iterator<T>{
    Node<T> current = head;
    Node<T> previous = head;

Я получаю это:

    Type mismatch: cannot convert from 
    RegLinkList<T>.Node<T> to RegLinkList<T>.Node<T>    

Edit: Мое текущее решение - непроверенный актерский состав

    public class ListIterator<T> implements Iterator<T>{
    Node<T> current = (Node<T>) head;
    Node<T> previous = (Node<T>) head;

1 Ответ

0 голосов
/ 31 марта 2019

Причина, по которой вы получаете эту ошибку, заключается в том, что компилятор делает то, что вы говорите, а не то, что вы имеете в виду.T для ListIterator и T для RegLinkList рассматриваются как два разных типа.Стало бы более понятным, если бы вы использовали, например, U вместо T.

. Решением вашей проблемы могло бы стать создание статических классов и передача элемента head в конструктор.Таким образом, вы по-прежнему объявляете разные T s, но поскольку вы передаете исходный элемент (и поэтому «сообщаете» компилятору, что один T совпадает с другим), он будет счастлив.Следующий код успешно скомпилирован (я добавил недостающие реализации методов без функциональных возможностей):

import java.util.Iterator;

public class RegLinkList<T> implements Iterable<T> {
    private Node<T> head;

    public RegLinkList() {
        head = null;
    }

    public static class Node<T> {
        public Node<T> next = null;
        public T data = null;

        Node(T data) {
            this.data = data;
        }
    }

    public static class ListIterator<T> implements Iterator<T> {
        Node<T> current;
        Node<T> previous;

        public ListIterator(Node<T> head) {
            current = head;
            previous = head;
        }


        @Override
        public boolean hasNext() {
            return false;
        }
        @Override
        public T next() {
            return null;
        }
    }

    @Override
    public Iterator<T> iterator() {
        return new ListIterator<T>(head);
    }
}
...