Grazie per la risposta ma mi è stato imposto dall'alto di non implementare Comparable nel grafo.
Provo a spiegarmi meglio:
ho un grafo fatto in questo modo:
dove V è il tipo dei vertici (nodi) e E è il tipo dell' arco che fra le altre informazioni contiene un valore Double che rappresenta il suo peso.codice:public class SparseGraph<V, E extends DoubleSupplier> implements Graph<V, E>{...}
dove E è il tipo di elemento e P la sua priorità.codice:e poi la coda: public class PriorityQueueHeap<E, P extends Comparable<? super P>> implements PriorityQueue<E, P> {...}
Adesso dovrei inserire all' interno della coda i vertici del grafo come elementi della coda e il valore Double dell'arco(o tutto l'arco) come priorità della coda.
Il problema è che la coda si aspetta che l'oggetto da usare come priorità implementi Comparable.
La definizione di grafo non posso modificarla, invece posso cambiare come voglio la coda.
Dando un occhiata al codice di PriorityQueue di Java ho capito che potrei risolvere scrivendo un costruttore che prenda anche un Comparator e dopo decidere se fare i confronti con Comparable o Comparator come qui: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/PriorityQueue.java#PriorityQueue.siftDown%28int%2C java.lang.Object%29)
Dunque nel mio caso potrei passare un comparatore che confronta i getAsDouble di DoubleSupplier.
Solo che non mi torna una cosa dell'implementazione della coda di Java: non mette restrizioni al tipo E dell'elemento, e se c'è il Comparator usa quello, altrimenti fa un cast a Comparable. Ma come fa a determinare che E sia castabile a Comparable? lo fa sulla fiducia sperando di non lanciare un eccezione?
EDIT @Andbin non avevo visto il tuo messaggio. Per me è fondamentale poter modificare il valore della priorità di un elemento già presente nella coda. È il motivo che mi ha spinto ad usare una mia implementazione invece che quella fornita da Java

Rispondi quotando