Slechte operandtypen voor binaire operator “>”?

Ik ben een BST-programma aan het schrijven. Ik krijg de foutmelding:

“Slechte operandtypen voor binaire operator “>”

eerste type: java.lang.Object

tweede type: java.lang.Object”

Dit is de methode waarbij ik de fout krijg:

public void placeNodeInTree(TreeNode current, TreeNode t)                                                                    
{   
    if(current == null)
        current = t;
    else{
       if(current.getValue() > t.getValue()) 
            current.setRight(t);
       if(current.getValue() < t.getValue()) 
            current.setLeft(t);  
        }
}

getValue() heeft het retourtype Object, dus de java.lang.Object-typen. Dit is de eerste keer dat ik deze fout ooit heb gezien. Kan iemand mij wat achtergrondinformatie geven over deze fout? Bedankt


Antwoord 1, autoriteit 100%

Natuurlijk – u kunt de operator >gewoon niet tussen objecten toepassen. Wat zou je ervan verwachten? U kunt ook geen van de andere binaire operatoren toepassen – +, -, /enz. (met uitzondering van tekenreeksaaneenschakeling).

Idealiter zou u uw TreeNodegeneriekmoeten maken, en ofwel een Comparator<T>moeten hebben die elke twee instanties kan vergelijken, of maak T extend Comparable<T>. Hoe dan ook, je kunt ze dan vergelijken met:

int comparisonResult = comparator.compare(current.getValue(), t.getValue());
if (comparisonResult > 0) {
  // current "greater than" t
} else if (comparisonResult < 0) {
  // current "less than" t
} else {
  // Equal
}

of

int comparisonResult = current.getValue().compareTo(t.getValue());
// Code as before

Zonder generieke geneesmiddelen zoude waarden kunnen casten naar Comparableof toch een algemene Comparatorgebruiken… maar generieke geneesmiddelen zouden een betere gok zijn.


Antwoord 2, autoriteit 83%

Java ondersteunt geen overbelasting van operators, dus de operator <is niet gedefinieerd voor niet-primitieve typen. In plaats daarvan wilt u waarschijnlijk de Comparable<T>-interface gebruiken.


Antwoord 3, autoriteit 33%

Je kunt geen objecten vergelijken met >of <. Je moet ze vergelijken met een methode, zoals CompareTo (die je moet implementeren).


Antwoord 4, autoriteit 33%

Je kunt twee arbitrage-objecten niet vergelijken met de operator >. De operator >kan alleen (direct) worden gebruikt op primitieve integer-typen.

U kunt de objecten die u wilt vergelijken de interface java.lang.Comparableimplementeren en vervolgens de methode compareToerop aanroepen om ze te vergelijken.

Comparable left = (Comparable)current.getValue();
Comparable right = (Comparable)t.getValue();
if (left.compareTo(right) > 0)
    current.setRight(t);
// etc.

Antwoord 5, autoriteit 17%

De standaardimplementatie van is gelijk aan alleen geeft om referentiegelijkheid. Een object weet niet of Cat groter is dan Apple en het zal het ook niet schelen. U moet een concrete implementatie bieden die zowel gelijken als hashcode overschrijft en de vergelijkbare interface implementeert. Hiermee kun je bepalen of Cat in feite groter is dan Apple.


Antwoord 6

Ik denk dat je gewoon andere primitieve variabelen kunt gebruiken, zoals

int temp=(int)current.getValue();

Other episodes