2

对于课堂作业,我们不能使用任何语言 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 没有。但是,根据this ,Java 的 LinkedList 也没有实现它。那么问题出在哪里,我该如何解决呢?

我的链接列表:

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);
}

我的树:

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);
}
4

2 回答 2

5

我假设您的 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与类型有关。

于 2010-05-06T22:44:21.520 回答
0

为什么你的链表必须接受一个Comparable类型?

对于集合数据结构,强制您的集合只接受特定的数据类型是非常有限的。如果您想要一个排序的链表,最好接受任何元素并允许您的链表接受一个Comparator对象。如果您不提供 a Comparator,那么您可以依赖所包含元素的自然顺序(如果它们是Comparable类型化的)。

看一下SortedSetSortedMap api 签名的一些例子。

于 2010-05-06T22:50:51.110 回答