我有一个小程序,应该根据它的值对地图进行排序.这是我到目前为止:
public static <K, V extends Comparable< ? extends V>> Map<K, V>
sortByValues(final Map <K, V> mapToSort)
{
List<Map.Entry<K, V>> entries =
new ArrayList<Map.Entry<K, V>>(mapToSort.size());
entries.addAll(mapToSort.entrySet());
Collections.sort(entries, new Comparator<Map.Entry<K, V>>()
{
public int compare(
final Map.Entry<K, V> entry1,
final Map.Entry<K, V> entry2)
{
return entry1.getValue().compareTo(entry2.getValue());
}
});
Map<K, V> sortedMap = new LinkedHashMap<K, V>();
for (Map.Entry<K, V> entry : entries)
{
sortedMap.put(entry.getKey(), entry.getValue());
}
return sortedMap;
}
Run Code Online (Sandbox Code Playgroud)
我希望我的通用值V可以与V或者至少是V的子类的任何东西相比.
我得到代码片段的以下错误:
public static <K, V extends Comparable< ? extends V>>
Run Code Online (Sandbox Code Playgroud)
绑定不匹配:类型V的方法compareTo(?extends V)不适用于参数(V).通配符参数?extends V没有下限,实际上可能比参数V更具限制性
怎么会更严格?
如果我将声明更改为:
public static <K, V extends Comparable< ? super V>>
Run Code Online (Sandbox Code Playgroud)
那就没有错误.但这不是我想要的.
我有一个解决方法是,我可以将声明更改为:
public static <K, V extends Comparable<V>>
Run Code Online (Sandbox Code Playgroud)
但是这样做我失去了灵活性,因为我无法传递一个Map,它的值实现了与自身的子类Comparable.
为这么长的问题道歉.提前致谢.
我认为你的第二个选择,即
Run Code Online (Sandbox Code Playgroud)public static <K, V extends Comparable<? super V>>
是的方式。我认为是这样,因为当你写的时候
Run Code Online (Sandbox Code Playgroud)public static <K, V extends Comparable<C extends V>>
您基本上是说您希望能够将的任何实例V与 的任何实例C进行比较。但这里缺少的是,因为您想Collections.sort(..)在内部调用,所以您还必须能够将的任何实例C与 的任何实例V进行比较。但泛型并没有表达这一点,编译器理所当然地会抱怨。
基本上,要对某些值(至少使用Collections.sort(..))进行排序,它们必须是相互可比较的,但您设想的通用限制只能保证您可以在一个方向进行比较。
| 归档时间: |
|
| 查看次数: |
2176 次 |
| 最近记录: |