no considerar hacer K
un genérico, pero utilizando una interfaz que envuelve la envoltura primitiva (una doble envoltura!).
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);
}
}
}
En pocas palabras, la idea es que cada vez que se crea una instancia de una nueva clase, se crea y se pone en un mapa hash estática que almacena los valores mínimos para cada clase un valor mínimo. (De hecho, estos valores NO son NADA en absoluto, solo un objeto centinela, pero como usaremos la igualdad de objetos para determinar si algo es el valor mínimo, esto no es ningún problema). Todo lo que es necesario es que el objeto envuelto sea comparable a otras instancias de sí mismo en general.
Una desventaja es que cuando llame al getMinValue
tendrá advertencias del compilador, ya que el tipo de devolución no tendrá información genérica. Puede haber una forma más elegante de evitar esto, pero no puedo pensarlo ahora.
Esta idea general puede ser bastante buena en general. Sin embargo, realmente debería insistir: esto se romperá por completo si lo prueba con cualquier polimorfismo o cualquier combinación de clases comparables entre sí. Long
sy Integer
s en el mismo árbol te destruirán por completo.
¿Podría ofrecer algún código de muestra que ilustre cómo desea usar K? –
¿Puedes elaborar un poco? Algún código relevante sería bueno. –
Por cierto, las versiones de objeto de los literales numéricos extienden java.lang.Number. Desafortunadamente, Number no tiene nada como getMaximumValue(). – Powerlord