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 с подклассом
Прошу прощения за такой длинный вопрос. Заранее спасибо.