创建一个可以按值排序的Map
。
代码按预期执行,但不能干净地编译:
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
进行编译时不抑制它们)?
谢谢!
答案 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>
。 ...