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