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);
}
}
}
簡単に言うと、新しいクラスがインスタンス化されるたびに、最小値が作成され、各クラスの最小値を格納する静的ハッシュマップに配置されるという考え方です。(実際、これらの値はまったく何もありません。センチネルオブジェクトだけですが、オブジェクトの等価性を使用して、何かが最小値であるかどうかを判断するため、これはまったく問題ありません。)必要なのは、ラップされたオブジェクトが比較可能であることだけです。一般的にそれ自体の他のインスタンスに。
1つの欠点はgetMinValue
、return型には一般的な情報がないため、呼び出すときにコンパイラの警告が表示されることです。これを回避するためのよりエレガントな方法があるかもしれませんが、私は今それを考えることができません。
この一般的な考え方は、全体的にかなり良いかもしれません。ただし、私は本当に強調する必要があります。これは、ポリモーフィズムまたは相互に比較可能なクラスの混合で試してみると、絶対に壊れます。 同じツリー内のLong
sとsは完全にあなたを破壊します。Integer