Бесконтрольный звонок для сравнения - PullRequest
0 голосов
/ 02 января 2011

Фон

Создайте Map, который можно отсортировать по значению.

Проблема

Код выполняется должным образом, но не компилируется чисто:

http://pastebin.com/bWhbHQmT

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) Typecast, показанный в предупреждении, может быть отброшен - ускользает от меня.

Предупреждение

Явная жалоба компилятора:

SortableValueMap.java: 24: warning: [unchecked] непроверенный вызов compareTo (T) как члена типа raw java.lang.Comparable

   return ((Comparable)entry1.getValue()).compareTo( entry2.getValue() );

Вопрос

Как можно изменить код для компиляции без какого-либопредупреждения (без их подавления при компиляции с -Xlint:unchecked)?

Связанные

Спасибо!

Ответы [ 3 ]

6 голосов
/ 02 января 2011

Объявите тип 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());
        }
    });
2 голосов
/ 02 января 2011

Значение должно быть подклассом сопоставимых.

SortableValueMap<K, V extends Comparable>

Попробуйте выше.

1 голос
/ 02 января 2011

Синтаксис для передачи Comparable в качестве универсального параметра вместе с Map.Entry (где V должен быть Comparable?) - так что (тип 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>....

...