你如何比较两个通用类?
class Entry<K,V>
{
protected K key;
protected V value;
public K getKey() { return key; }
public V getValue() { return value; }
public static Comparator KeyComparator = new Comparator()
{
public int compare(Object o1, Object o2)
{
int key1 = ( (Entry) o1 ).getKey();
int key2 = ( (Entry) o2 ).getKey();
if (key1 > key2)
{
return 1;
}
else if (key1 < key2)
{
return -1;
}
else
{
return 0;
}
}
};
}
我收到以下编译错误:
int key1 = ( (Entry) o1 ).getKey();
^
int key2 = ( (Entry) o2 ).getKey();
^
incompatible types
found : java.lang.Object
required: int
K
和V
将在循环播放列表实现中使用Integer
。是否有一种更简单的方式(或者至少有一种方法)可以像我通常用int
那样进行比较?
答案 0 :(得分:5)
您还需要一般性地定义比较器:
public static <T extends Comparable<? super T>> Comparator<T> naturalOrder()
{
return new Comparator<T> {
public int compare(T o1, T o2) { return o1.compareTo(o2); }
}
}
答案 1 :(得分:2)
您在Entry类中的键不是int
类型,而是类型K
。由于您没有参数化比较器,因此默认为Object
。
如果您确定使用Integer for K和V,那么在这种情况下您不需要泛型。在这种情况下使用Comparator<Integer>
。
提示:在这种情况下,你可以依赖继承的Integer#compareTo(Integer i)
方法,因为整数是可比较的(除了int
之类的java原语)
答案 2 :(得分:2)
将比较器代码更改为:
public static Comparator<Entry<Integer,?>> KeyComparator = new Comparator<Entry<Integer,?>>()
{
public int compare(Entry<Integer,?> o1, Entry<Integer,?> o2)
{
Integer key1 = o1.getKey();
Integer key2 = o2.getKey();
return key1.compareTo(key2);
}
}
这将产生强制执行泛型的副作用,并确保不对未使用整数键入的条目使用它。
但是,您可能会发现只应在没有泛型的情况下getKey()
返回Integer
。保持<K>
虽然......