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は実装しません。ただし、これによると、JavaのLinkedListもそれを実装していません。では、何が問題で、どうすれば修正できますか?

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);
}
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のタイプは次のとおりです。TLinkedList<T>に境界はありません。MyLinkedListでは、パラメーターがそれ自体(またはそのスーパークラス)のComparableを実装する必要がありますが、実際には、LeftistTreeは生のComparable(またはComparable<?>)を実装していたため、Comparableは保証されませんでした。タイプに関連します。

于 2010-05-06T22:44:21.520 に答える
0

リンクリストが入力を受け入れる必要があるのはなぜComparableですか?

コレクションデータ構造の場合、コレクションに特定のデータ型のみを受け入れるように強制することは非常に制限されます。ソートされたリンクリストが必要な場合は、任意の要素を受け入れ、リンクリストがComparatorオブジェクトを受け入れることを許可することをお勧めします。を指定しない場合、それらが型指定されComparatorていれば、含まれている要素の自然な順序に依存できます。Comparable

いくつかの例については、SortedSetまたはSortedMapapi署名を見てください。

于 2010-05-06T22:50:51.110 に答える