考虑不要制作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 在同一棵树上会彻底摧毁你。