كيف لا تقبل Java قائمة Linkedlist الخاصة بي في عام ، ولكنها تقبل ملكها؟
-
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
مطبوع.