未经检查的调用compareTo

时间:2011-01-02 05:31:03

标签: java generics collections comparator comparable

背景

创建一个可以按值排序的Map

问题

代码按预期执行,但不能干净地编译:

http://pastebin.com/bWhbHQmT

public class SortableValueMap<K, V> extends LinkedHashMap<K, V> {
  ...
  public void sortByValue() {
      ...
      Collections.sort( list, new Comparator<Map.Entry>() {
          public int compare( Map.Entry entry1, Map.Entry entry2 ) {
            return ((Comparable)entry1.getValue()).compareTo( entry2.getValue() );
          }
      });
  ...

Comparable作为通用参数传递给Map.Entry<K, V>(其中V必须为Comparable?)的语法 - 以便(Comparable)警告中显示的类型转换可以被删除 - 包括我。

警告

编制者的脾气暴躁的抱怨:

  

SortableValueMap.java:24:警告:[unchecked] unchecked调用compareTo(T)作为原始类型的成员java.lang.Comparable

   return ((Comparable)entry1.getValue()).compareTo( entry2.getValue() );

问题

如何在没有任何警告的情况下将代码更改为编译(在使用-Xlint:unchecked进行编译时不抑制它们)?

相关

谢谢!

3 个答案:

答案 0 :(得分:6)

声明V类型以扩展Comparable<V>接口。这样,您可以删除Map.Entry对象的强制转换为(Comparable)并改为使用推断类型:

public class SortableValueMap<K, V extends Comparable<V>>
             extends LinkedHashMap<K, V> {

...

    Collections.sort(list, new Comparator<Map.Entry<K, V>>() {
        public int compare(Map.Entry<K, V> entry1, Map.Entry<K, V> entry2) {
            return entry1.getValue().compareTo(entry2.getValue());
        }
    });

答案 1 :(得分:2)

该值应该是可比较的子类。

SortableValueMap<K, V extends Comparable>

尝试以上方法。

答案 2 :(得分:1)

  

将Comparable作为泛型参数传递给Map.Entry(其中V必须是Comparable?)的语法 - 以便警告中显示的(可比较)类型转换可以被删除 - 不包括在内。

怎么样:

public class SortableValueMap <K, V extends Comparable<V>> extends LinkedHashMap<K, V> { 
  ...
    Collections.sort(list, new Comparator<Map.Entry<K, V>>() {
        public int compare(Map.Entry<K, V> entry1, Map.Entry<K, V> entry2) {
            return (entry1.getValue()).compareTo(entry2.getValue());
        }
    });

但这可能会更好,具体取决于您的意图:

public class SortableValueMap <K, V extends Comparable<? super V>> extends LinkedHashMap<K, V> { ...

请参阅http://download.oracle.com/javase/tutorial/extra/generics/morefun.html

  

没有必要将T与其本身相比较。所需要的只是T与其超类型之一相当。这给了我们:

public static <T extends Comparable<? super T>>  max(Collection<T> coll)
     

...这种推理几乎适用于任何类型的Comparable用法:您总是希望使用Comparable <? super T>。 ...