Java泛型比较

时间:2009-11-25 08:46:51

标签: java generics comparison arraylist

你如何比较两个通用类?

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

KV将在循环播放列表实现中使用Integer。是否有一种更简单的方式(或者至少有一种方法)可以像我通常用int那样进行比较?

3 个答案:

答案 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>虽然......