Общий метод сортировки карты по значениям

I есть небольшая программа, которая должна сортировать карту на основе ее значений. Вот что у меня есть на данный момент:

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

Я хочу, чтобы мое общее значение V было сопоставимо со всем, что либо V, либо, по крайней мере, подкласс V .

Я получаю следующее из-за ошибки для фрагмента кода:

public static <K, V extends Comparable< ? extends V>>

Несоответствие привязки: метод compareTo (? расширяет V) типа V не применяется для аргументов (V). Подстановочный знак параметр? расширяет V не имеет нижнего связаны, и на самом деле может быть больше ограничительный, чем аргумент V

Как он может быть более ограничительным?

Если я изменю объявление на:

public static <K, V extends Comparable< ? super V>>

, то ошибки не будет. Но это не то, что я хочу.

У меня есть обходной путь: я могу изменить объявление на:

public static <K, V extends Comparable<V>>

, но, делая это, я теряю гибкость, так как не могу передать Map, значение которого реализует Comparable с подклассом

Прошу прощения за такой длинный вопрос. Заранее спасибо.

8
задан Swaranga Sarma 9 June 2011 в 12:32
поделиться