2012-03-30 5 views
2

Der Compiler sagt "Kann nicht finden Symbol: Methode compareTo (java.lang.Object)". Könnten Sie bitte beraten, wo ist der Fehler hier? HierGibt es eine Möglichkeit, compareTo-Methode zu implementieren, die jedes übergebene Argument vergleichen würde?

ist der Teil des Codes:

public class OBTComparable<ObjectType> implements Comparable<OBTComparable> 
{ 
    public OTBComparable leftNode = null; 
    public OBTComparable mainNode = null; 
    public OBTComparable rightNode = null; 
    public ObjectType object = null; 

    public OBTComparable(ObjectType requiredObject) 
    { 
     object = requiredObject; 
    } 

    @Override 
    public int compareTo(OBTComparable other) 
    { 
     if(object.compareTo(other.object) == 0) 
      return 0; 
     else 
      if (object.compareTo(other.object) > 0) 
       return 1; 
      else return -1; 
    } 
} 

Antwort

2

Objecttype muss auch Comparable<ObjectType> implementieren.

Und wenn Sie dies tun, glaube ich, dass dies:

public int compareTo(OBTComparable other) 
{ 
    if(object.compareTo(other.object) == 0) 
     return 0; 
    else 
     if (object.compareTo(other.object) > 0) 
      return 1; 
     else return -1; 
} 

kann dies vereinfacht werden:

public int compareTo(OBTComparable other) 
{ 
    return object.compareTo(other.object); 
} 
4

Sie zum Umfang benötigen zu ObjectType-Comparable, weil OBTComparable ist delegatingcompareTo() zu ObjectType:

Wenn Sieändern 0-<ObjectType extends Comparable<ObjectType>>, wird es kompilieren:

public class OBTComparable<ObjectType extends Comparable<ObjectType>> implements Comparable<OBTComparable> 
3

Ich denke, dies der richtige Code ist Sie suchen (I ersetzt ObjectType mit T für Klarheit):

class OBTComparable<T extends Comparable<? super T>> implements Comparable<OBTComparable<T>> { 
    public OBTComparable<T> leftNode = null; 
    public OBTComparable<T> mainNode = null; 
    public OBTComparable<T> rightNode = null; 
    public T object = null; 

    public OBTComparable(T requiredObject) { 
     object = requiredObject; 
    } 

    @Override 
    public int compareTo(OBTComparable<T> other) { 
     if (object.compareTo(other.object) == 0) { 
      return 0; 
     } else if (object.compareTo(other.object) > 0) { 
      return 1; 
     } else return -1; 
    } 
} 

Was habe ich ändern:

  1. OBTComparable verwendet einen Typparameter, daher sollten Sie ihn anzeigen, wenn Sie Comparable implementieren. Deshalb haben Sie implements Comparable<OBTComparable<T>> statt einfach implements Comparable<OBTComparable>.
  2. Sie vergleichen zwei Objekte in der compareTo Methode, aber sind sie vergleichbar? Um sicherzustellen, dass diese Anforderung erfüllt ist, sollten Sie OBTComparable<T extends Comparable<T>> anstatt nur OBTComparable<T> schreiben. Dann werden Sie wissen, dass Sie compareTo anrufen können.
+0

Vielen Dank! Das ist hervorragend! Es funktioniert jetzt. –

+1

für die besten Ergebnisse verwenden '>' – newacct

+0

@newacct Ich stimme zu, vergaß die PECS-Regel. – Malcolm

Verwandte Themen