Java vergelijkende generieke typen

In Java schreef ik een binaire zoekboomklasse die knooppunten toevoegt met behulp van recursie. Nu wil ik het generaliseren met Generics, zodat ik meer over hen kan leren.

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

Mijn functie om knooppunten toe te voegen is in de volgende klas

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

De hoofdklasse heeft de volgende code om dingen uit te schoppen. Ik gebruik strings, maar het gegevenstype kan een complex type zijn.

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

Ik begon de Vergelijkbare interface te gebruiken, maar hoe schrijf ik dan de CompareTo() functie? Ik weet niet welk type T zal zijn? De fout die ik kreeg was “De operator < is niet gedefinieerd voor de argumenttype(n) T, T”.

Op zoek naar een oplossing, was een antwoord Generieke typen Java vergelijken:

class Element<T extends Comparable<T>>

Ik begrijp niet waar dit heen moet en hoe het verschilt van de klasse die Comparable implementeert. De enige plaats waar ik het type ken, is in de hoofdklasse, dus zou de CompareTo() daar moeten zijn? Ik heb gekeken om van GBinTree een interface te maken, maar raakte in de war of dat de juiste weg was? Alle hulp wordt op prijs gesteld.


Antwoord 1, autoriteit 100%

Je kunt operators in Java niet overbelasten. De operator <is alleen van toepassing op primitieve (of numerieke) typen, niet op referentietypen. Aangezien Teen typevariabele is die een referentietype vertegenwoordigt, kunt u <niet gebruiken voor variabelen van het type T. Je moet gebruiken

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

controleer de geretourneerde waarde en besluit ermee te doen wat u wilt.

Je weet niet wat het type Tzal zijn, maar je weet dat het een type zal zijn dat Comparableimplementeert en daarom de compareTo()methode.


Antwoord 2, autoriteit 3%

U kunt deze eenvoudige aanpak gebruiken
voor gegevens groter dan root.getData = 1, voor gegevens is gelijk aan root.getData = 0, voor gegevens kleiner dan root.getData = -1

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

Other episodes