كيف لا تقبل Java قائمة Linkedlist الخاصة بي في عام ، ولكنها تقبل ملكها؟

StackOverflow https://stackoverflow.com/questions/2784816

  •  03-10-2019
  •  | 
  •  

سؤال

بالنسبة لمهمة الفصل ، لا يمكننا استخدام أي من أنواع اللغات 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 يعتقل الواجهة المماثلة ، لكن MyLinkedList لا. ومع ذلك ، فإن LinkedList من Java لا تنفذها أيضًا ، وفقًا لـ هذه. إذن ما هي المشكلة وكيف يمكنني إصلاحها؟

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

مايتري:

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);
}
هل كانت مفيدة؟

المحلول

أفترض أن 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 أن المعلمة تنفذ قابلة للمقارنة عن نفسها (أو فطائرها الفائقة) ، ولكن في الواقع كانت Leftistree تنفذ RAW قابلة للمقارنة (أو Comparable<?>) لذلك لم يكن من الممكن أن تكون مرتبطة بالنوع.

نصائح أخرى

لماذا يجب أن تقبل قائمتك المرتبطة Comparable مكتوب؟

بالنسبة إلى بنية بيانات التجميع ، فإن إجبار مجموعتك على قبول نوع البيانات المحدد فقط هو محدود للغاية. إذا كنت ترغب في الحصول على قائمة مرتبطة بالفرز ، فمن الأفضل قبول أي عنصر والسماح لقائمة الارتباط الخاصة بك بقبول أ Comparator هدف. إذا لم تقدم Comparator, ، ثم يمكنك الاعتماد على الترتيب الطبيعي للعنصر الموجود إذا كانوا من Comparable مطبوع.

ألق نظرة على sortedset أو sortedMap توقيع API لبعض الأمثلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top