在值上对映射进行排序的通用方法

Swa*_*rma 8 java generics

我有一个小程序,应该根据它的值对地图进行排序.这是我到目前为止:

    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.

为这么长的问题道歉.提前致谢.

Wal*_*inz 4

我认为你的第二个选择,即

public static <K, V extends Comparable<? super V>>
Run Code Online (Sandbox Code Playgroud)

是的方式。我认为是这样,因为当你写的时候

public static <K, V extends Comparable<C extends V>>
Run Code Online (Sandbox Code Playgroud)

您基本上是说您希望能够将的任何实例V与 的任何实例C进行比较。但这里缺少的是,因为您想Collections.sort(..)在内部调用,所以您还必须能够将的任何实例C与 的任何实例V进行比较。但泛型并没有表达这一点,编译器理所当然地会抱怨。

基本上,要对某些值(至少使用Collections.sort(..))进行排序,它们必须是相互可比较的,但您设想的通用限制只能保证您可以在一个方向进行比较。