non considerare la K
un generico, ma utilizzando un'interfaccia che avvolge l'involucro primitivo (un doppio involucro!).
import java.util.HashMap;
public class NodeWrapper<K extends Comparable<K>> implements Comparable<NodeWrapper<K>> {
private static HashMap<Class, NodeWrapper> minVals = new HashMap<Class, NodeWrapper>();
private K value;
private NodeWrapper() {
super();
}
public NodeWrapper(K value, Class<K> clazz) {
super();
this.value = value;
if (minVals.get(clazz)==null) {
minVals.put(clazz, new NodeWrapper<K>());
}
}
public K getValue() {
return value;
}
public static NodeWrapper getMinValue(Class clazz){
return minVals.get(clazz);
}
public void setValue(K value) {
this.value = value;
}
@Override
public int compareTo(NodeWrapper<K> o) {
NodeWrapper min = minVals.get(this.getClass());
if (this==min && o==min) {
return 0;
} else if (this==min){
return -1;
} else if (o==min){
return 1;
} else {
return this.value.compareTo(o.value);
}
}
}
Brevemente, l'idea è che ogni volta che una nuova classe viene istanziata, viene creato un valore minimo e messo in un hashmap statico che memorizza i valori minimi per ciascuna classe. (In realtà, questi valori NON sono NIENTE, solo un oggetto sentinella, ma poiché useremo l'uguaglianza degli oggetti per determinare se qualcosa è il valore minimo, questo non è affatto un problema.) Tutto ciò che è necessario è che l'oggetto avvolto sia paragonabile ad altri esempi di sé in generale.
Uno svantaggio è che quando si chiama getMinValue
si avranno avvisi del compilatore, poiché il tipo di ritorno non avrà informazioni generiche. Potrebbe esserci un modo più elegante intorno a questo, ma non riesco a pensarci proprio ora.
Questa idea generale potrebbe essere piuttosto bella nel complesso. Tuttavia, dovrei davvero sottolineare: questo si interromperà assolutamente se lo proverai con qualsiasi polimorfismo o qualsiasi mix di classi comparabili tra loro. Long
s e Integer
s nello stesso albero ti distruggeranno completamente.
fonte
2009-04-29 20:08:28
Sareste in grado di offrire alcuni esempi di codice che illustrano come si desidera utilizzare K? –
Puoi approfondire un po '? Qualche codice rilevante sarebbe bello. –
Per inciso, le versioni oggetto di valori letterali numerici si estendono tutti java.lang.Number. Sfortunatamente, Number non ha nulla come getMaximumValue(). – Powerlord