2009-11-25 213 views
1

你如何去比较两个泛型类?Java泛型比较

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将是一个圆形的ArrayList实现中使用Integer秒。有没有更简单的方法(或至少有一个有效)比较像我通常会与int

+0

Java不知道,会被用来做什么的通用对象。 – Trick 2009-11-25 08:48:57

+0

你可以发布更多的编译错误 - 包括行号。对于这个问题可能没问题,但一般来说,在寻求帮助时这是有用的信息。 – Chii 2009-11-25 08:53:34

回答

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); 
     } 
    } 

这将有强制执行generi的副作用cs,并确保您不会将其用于未使用Integer键入的条目。

然而,你可能会发现,你应该只让getKey()Integer没有泛型。保持<K>虽然...

2

您在Entry类中的密钥不是int类型,而是类型K。而且,因为您不参数化比较器,所以它默认为Object

如果您肯定对K和V使用Integer,那么在这种情况下您不需要泛型。在这种情况下使用Comparator<Integer>

提示:在这种情况下,你可以依靠继承Integer#compareTo(Integer i)方法,因为整数是可比的(其他类似int那么Java元)

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); } 
    } 
} 
+0

伟大的通用。保持它。 – marcolopes 2013-02-03 23:24:37