2015-07-07 11 views
6

Sto cercando di fare uno SkipList e ho un metodo che accetta un tipo generico di dati:Generics e compareTo() metodo

public void add(E key, Integer value) 
{ 
    Node<E> p; 
    p = find(key); 
} 

che porta qui:

public Node<E> find(E key) 
{ 
    //Start at head 
    Node<E> p = head; 

    while (true) 
    { 
     while ((p.getRight().getKey() != Node.posInf) && (p.getRight().getKey().compareTo(key) <= 0)) 
     { 
      p.setRight(p.getRight()); 
     } 

     //More stuff down here 
    } 
} 

Il problema è sul metodo compareTo(). Dice che il metodo compareTo() non è definito per il tipo E. In Eclipse mi vuole aggiungere due conversioni di tipo simile a questo:

((String) p.getRight().getKey().compareTo((String) key) <= 0)

Perché si vuole String? Il tipo di dati potrebbe essere qualsiasi cosa. Ho provato a fare typecast di E, ma Eclipse vuole cambiarlo di nuovo in String. Qualsiasi aiuto sarebbe apprezzato.

+1

Se il tipo di dati può essere qualsiasi cosa (non hai mostrato la definizione), allora il compilatore non sa se ha o meno un metodo 'compareTo()', perché potrebbe essere un tipo che non averlo. – RealSkeptic

+0

@OlivierPoulin Stavo cercando di modificare [questa implementazione] (http://www.mathcs.emory.edu/~cheung/Courses/323/Syllabus/Map/skip-list-impl.html) di un SkipList per includere i generici . Questo metodo sta solo attraversando l'elenco e cercando un posto appropriato in cui posso aggiungere un nodo. – cress

risposta

7

Non è stato indicato come è definito E, ma il messaggio di errore indica che non è stato posizionato un limite superiore di Comparable<E> sulla dichiarazione di E.

si può realizzare che con qualcosa di simile sulla vostra classe:

public class SkipList<E extends Comparable<E>> 

Questo vi permetterà di chiamare compareTo sul tuo key variabile di tipo E.

Per quanto riguarda il motivo per cui Eclipse suggerisce il casting su un String, sembra che Eclipse stia indovinando quale sarebbe la migliore modifica da apportare per renderlo compilabile. Potrebbe aver indovinato String perché è Comparable<String>. In questo caso, è sbagliato, perché E non è necessariamente un String. La soluzione qui è diversa, come ho detto sopra: limitare E ad essere Comparable<E>.

+0

Grazie mille! Questo ha molto senso ora. – cress

+2

per risultati ottimali usare '>' – newacct

5

Il metodo compareTo è definito nell'interfaccia java.lang.Comparable. Non c'è nulla nel codice che dice al compilatore che il parametro di tipo E è Comparable. È possibile farlo nella dichiarazione tipo generico:

class Node<E extends Comparable<E>> { 
    ... 
} 

Per impostazione predefinita, se non si dichiara extends Comparable, è possibile solo metodi di accesso definita nella classe java.lang.Object.

+0

Ooh! Non lo sapevo su Comparable. Grazie per l'aiuto! – cress

+0

per risultati ottimali usare '>' – newacct