web-dev-qa-db-fra.com

Java comparant les types génériques

En Java, j'ai écrit une classe Binary Search Tree qui ajoute des nœuds à l'aide de la récursivité. Maintenant, je veux généraliser à l'aide de génériques afin d'en apprendre plus à leur sujet.

public class GBinNode<T> {
    T item;
    GBinNode<T> left;
    GBinNode<T> right;

public GBinNode(T newItem) {
    item = newItem;
    left = null;
    right = null;
    }
public GBinNode(T it, GBinNode<T> le, GBinNode<T> ri) {
    item = it;
    left = le;
    right = ri;
    }
public String toString() {
    return item.toString()+" ";
    }
}

Ma fonction pour ajouter des nœuds est dans la classe suivante

public class GBinTree<T extends Comparable <T>> {
  GBinNode<T> add(T item, GBinNode<T> bn) {
    if (bn==null) {
        return new GBinNode<T>(item, null, null);
    }
    if (item < bn.item) {        // ERROR HERE
        bn.left = add( item, bn.left);
    }
    else {
        bn.right = add( item, bn.right);
    }
    return bn;
}

public void toString(GBinNode<T> root) {
    GBinNode<T> curr = root;
    if (curr == null)
        return;
    else {
        toString(curr.left);
        System.out.println(curr.toString());    // inorder traversal
        toString(curr.right);
    }
}

La classe principale a le code suivant pour lancer les choses. J'utilise des chaînes, mais le type de données peut être complexe.

GBinTree<String> bt = new GBinTree<String>();
    GBinNode<String> root = null;
    root = bt.add("Calex", root);
    root = bt.add("Ealex", root);
    root = bt.add("Balex", root);
    root = bt.add("Dalex", root);       
    bt.toString(root);

J'ai commencé à utiliser l'interface Comparable mais comment puis-je écrire la fonction CompareTo ()? Je ne sais pas quel type T sera? L'erreur que j'ai eu était "L'opérateur <n'est pas défini pour le ou les types d'argument T, T".

En recherchant une solution, une réponse fut Comparaison de types génériques Java :

class Element<T extends Comparable<T>>

Je ne comprends pas où cela devrait aller et en quoi c'est différent de la classe qui implémente Comparable. Le seul endroit où je sais que le type est dans la classe principale, alors le compareTo () devrait-il être là? J'ai envisagé de faire de GBinTree une interface, mais je me suis demandé si c'était la bonne piste? Toute aide serait appréciée.

16
Alex_B

Vous ne pouvez pas surcharger les opérateurs en Java. L'opérateur < s'applique uniquement aux types primitifs, pas aux types de référence. T étant une variable de type représentant un type de référence, vous ne pouvez pas utiliser < sur les variables de type T. Vous devez utiliser

if (item.compareTo(bn.item) < 0) 

vérifiez la valeur retournée et décidez de faire ce que vous voulez avec.

Vous ne savez pas quel sera le type T mais vous savez que ce sera un type qui implémentera Comparable et implémentera donc la méthode compareTo().

25

Vous pouvez utiliser cette approche simple
pour des données supérieures à root.getData = 1, pour des données égales à root.getData = 0, pour des données inférieures à root.getData = -1

public class BST<E extends Number & Comparable<? super E>>{
    void add(){
    ...
    if(data.compareTo(root.getData()) == 1)
    ...
}
0
user2483498