Почему Java не принимает мой LinkedList в Generic, но принимает свой собственный? - PullRequest
2 голосов
/ 07 мая 2010

При назначении класса мы не можем использовать ни один из языков bultin, поэтому я застрял в собственном списке Во всяком случае, вот ситуация:

public class CrazyStructure <T extends Comparable<? super T>> {
    MyLinkedList<MyTree<T>> trees; //error: type parameter MyTree is not within its bound
}

Тем не менее:

public class CrazyStructure <T extends Comparable<? super T>> {
    LinkedList<MyTree<T>> trees;
}

Работает. MyTree реализует интерфейс Comparable, а MyLinkedList - нет. Однако Java LinkedList также не реализует его, в соответствии с this . Так в чем проблема и как я могу это исправить?

MyLinkedList:

public class MyLinkedList<T extends Comparable<? super T>> {
    private class Node<T> {
        private Node<T> next;
        private T data;

        protected Node();
        protected Node(final T value);
    }

    Node<T> firstNode;

    public MyLinkedList();
    public MyLinkedList(T value);

    //calls node1.value.compareTo(node2.value)
    private int compareElements(final Node<T> node1, final Node<T> node2);

    public void insert(T value);
    public void remove(T value);
}

MyTree:

public class LeftistTree<T extends Comparable<? super T>>
        implements Comparable {

    private class Node<T> {
        private Node<T> left, right;
        private T data;
        private int dist;

        protected Node();
        protected Node(final T value);
    }

    private Node<T> root;

    public LeftistTree();
    public LeftistTree(final T value);
    public Node getRoot();

    //calls node1.value.compareTo(node2.value)
    private int compareElements(final Node node1, final Node node2);

    private Node<T> merge(Node node1, Node node2);
    public void insert(final T value);
    public T extractMin();
    public int compareTo(final Object param);
}

Ответы [ 2 ]

5 голосов
/ 07 мая 2010

Я предполагаю, что ваше MyTree такое же, как LeftistTree. Проблема с подписью в том, что она не реализует Comparable<LeftistTree<? super T>>.

Итак, подпись должна быть:

public class LeftistTree<T extends Comparable<? super T>>
    implements Comparable<LeftistTree<? super T>>

Причина в том, что ваш MyLinkedList не похож на обычный LinkedList. Обычный LinkedList имеет тип: LinkedList<T> нет границ для T. Вам необходимо с MyLinkedList, чтобы параметр реализовал Comparable сам по себе (или его суперкласс), но фактически LeftistTree реализовал необработанный Comparable (или Comparable<?>) таким образом, Comparable не был гарантированно связан с типом.

0 голосов
/ 07 мая 2010

Почему ваш связанный список должен принимать Comparable напечатанный?

Для структуры данных коллекции принуждение вашей коллекции только к определенному типу данных очень ограничено. Если вы хотите иметь отсортированный связанный список, лучше принять любой элемент и разрешить вашему связанному списку принимать объект Comparator. Если вы не предоставите Comparator, то вы можете положиться на естественное упорядочение содержащихся элементов, если они набраны Comparable.

Взгляните на SortedSet или SortedMap подпись API для некоторых примеров.

...