2010-05-06 18 views
2

Pour une affectation de classe, nous ne pouvons pas utiliser les types de langues bultin, donc je suis coincé avec ma propre liste. Quoi qu'il en soit, voici la situation:Pourquoi Java n'accepte pas mon LinkedList dans un Generic, mais accepte le sien?

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

Cependant:

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

Works. MyTree exécute l'interface Comparable, mais pas MyLinkedList. Cependant, Java LinkedList ne l'implémente pas non plus, selon this. Alors, quel est le problème et comment le réparer?

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

MonArborescence:

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

pouvons-nous voir votre définition 'MyLinkedList'? – OscarRyz

+6

Mieux nous montrer la déclaration de MyLinkedList et MyTree. – bmargulies

+0

édité les méthodes signatures, je peux poster le reste si tu veux –

Répondre

5

Je suppose que votre MonArborescence est le même que LeftistTree. Le problème avec la signature est qu'elle n'implémente pas Comparable<LeftistTree<? super T>>.

Ainsi, la signature devrait être:

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

La raison en est que votre MyLinkedList est pas comme une LinkedList régulière. Une LinkedList régulière est de type: LinkedList<T> Il n'y a pas de limite sur T. Vous avez besoin avec MyLinkedList que le paramètre implémente un Comparable de lui-même (ou sa superclasse), mais en fait LeftistTree implémente un Comparable brut (ou Comparable<?>) donc le Comparable était pas garanti d'être lié au type.

0

Pourquoi votre liste liée doit-elle accepter un Comparable tapé?

Pour une structure de données de collection, forcer votre collection à n'accepter que des types de données spécifiques est très limitatif. Si vous souhaitez avoir une liste liée triée, il est préférable d'accepter n'importe quel élément et de permettre à votre liste liée d'accepter un objet Comparator. Si vous ne spécifiez pas Comparator, vous pouvez vous fier à l'ordre naturel de l'élément contenu s'il est Comparable.

Jetez un oeil à la signature SortedSet ou SortedMap api pour un exemple.