未经检查的compareTo调用

发布于 2024-10-09 16:04:35 字数 1591 浏览 7 评论 0 原文

背景

创建一个可以按值排序的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(其中 V 必须是 Comparable code>?) - 这样警告中显示的 (Comparable) 类型转换就可以被删除 - 我感到困惑。

警告

编译器的脾气暴躁的抱怨:

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

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

问题

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

相关

谢谢!

Background

Create a Map that can be sorted by value.

Problem

The code executes as expected, but does not compile cleanly:

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

The syntax for passing Comparable as a generic parameter along to the Map.Entry<K, V> (where V must be Comparable?) -- so that the (Comparable) typecast shown in the warning can be dropped -- eludes me.

Warning

Compiler's cantankerous complaint:

SortableValueMap.java:24: warning: [unchecked] unchecked call to compareTo(T) as a member of the raw type java.lang.Comparable

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

Question

How can the code be changed to compile without any warnings (without suppressing them while compiling with -Xlint:unchecked)?

Related

Thank you!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

做个少女永远怀春 2024-10-16 16:04:36

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

Declare the V type to extend the Comparable<V> interface. That way, you can remove the cast of the Map.Entry objects down to (Comparable) and use the inferred type instead:

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());
        }
    });
寻找一个思念的角度 2024-10-16 16:04:36

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

SortableValueMap<K, V extends Comparable>

尝试以上方法。

The value should be a subclass of comparable.

SortableValueMap<K, V extends Comparable>

Try the above.

倾其所爱 2024-10-16 16:04:36

将 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 > max(集合 coll)

...这个推理几乎适用于任何旨在用于任意类型的 Comparable 用法:您总是想使用 Comparable 。 ...

The syntax for passing Comparable as a generic parameter along to the Map.Entry (where V must be Comparable?) -- so that the (Comparable) typecast shown in the warning can be dropped -- eludes me.

How about:

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

but this may be better, depending on your intent:

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

See http://download.oracle.com/javase/tutorial/extra/generics/morefun.html

It isn't necessary that T be comparable to exactly itself. All that's required is that T be comparable to one of its supertypes. This give us:

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

... This reasoning applies to almost any usage of Comparable that is intended to work for arbitrary types: You always want to use Comparable <? super T> . ...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文