【问题标题】:Unchecked call to compareTo对 compareTo 的未经检查的调用
【发布时间】:2011-01-02 05:31:03
【问题描述】:

背景

创建一个可以按值排序的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&lt;K, V&gt; 的语法(其中V 必须是Comparable?)——这样可以删除警告中显示的(Comparable) 类型转换——躲着我。

警告

编译器的抱怨:

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

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

问题

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

相关

谢谢!

【问题讨论】:

    标签: java generics collections comparator comparable


    【解决方案1】:

    声明V 类型以扩展Comparable&lt;V&gt; 接口。这样,您可以将 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());
            }
        });
    

    【讨论】:

    • 这就是票。谢谢!
    【解决方案2】:

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

    SortableValueMap<K, V extends Comparable>
    

    试试上面的。

    【讨论】:

      【解决方案3】:

      将 Comparable 作为通用参数传递给 Map.Entry 的语法(其中 V 必须是 Comparable?)——以便可以删除警告中显示的 (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 &lt;? super T&gt; 。 ...

      【讨论】:

      • 我在V extends Comparable&lt;? super V&gt; 的道路上没有成功。在做出 mhaller 建议的更改后,我可以使用 super V。谢谢!
      • @Dave - 对此感到抱歉。在发布之前我懒得在我的环境中测试它。
      • 一切都好,伯特。根据 mhaller 的回答,我需要更改 Collections.sort 的调用方式。不幸的是,我无法将两个答案都标记为正确。虽然 +1!
      • @Dave - 谢谢。我只是想确保答案是正确的,或者确保我撤回它。我通过 eclipse 运行代码并添加了 @mhaller 添加的相同的缺失通用参数,我第一次错过了。我更新了我的答案的顶部(现在是相同的 mhaller 的),我将把我的答案留给未来的读者注意“你总是想使用Comparable &lt;? super T&gt;”参考。
      猜你喜欢
      • 1970-01-01
      • 2011-06-17
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多