Не стоит делать K
универсальным, а использовать интерфейс, который обертывает примитивную оболочку (двойную оболочку!).
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);
}
}
}
Вкратце, идея заключается в том, что всякий раз, когда создается новый класс, создается минимальное значение и помещается в статическую хэш-карту, в которой хранятся минимальные значения для каждого класса. (На самом деле, эти значения вообще НИЧЕГО, просто объект-страж, но поскольку мы будем использовать равенство объектов, чтобы определить, является ли что-то минимальным значением, это вообще не проблема.) Все, что необходимо, - это сопоставить упакованный объект в других случаях сам по себе в целом.
Один недостаток заключается в том, что при вызове getMinValue
вы будете получать предупреждения компилятора, поскольку тип возвращаемого значения не будет иметь общей информации. Может быть, есть более изящный способ обойти это, но я не могу сейчас об этом думать.
Эта общая идея может быть довольно хорошей в целом. Тем не менее, я должен действительно подчеркнуть: это будет абсолютно сломано, если вы попробуете это с любым полиморфизмом или любым смешением взаимно сопоставимых классов. Long
s и Integer
s в одном и том же дереве полностью уничтожат вас.