Сравнимый является необработанным типом.Ссылки на универсальный тип Comparable <T>должны быть параметризованы - PullRequest
0 голосов
/ 20 декабря 2018

Я устанавливаю свою переменную как

Map<String, Function<CLASS_NAME, Comparable>> map = new HashMap<>();

, где Comparable выдает предупреждающее сообщение как

Comparable is a raw type. References to generic type Comparable<T> should be parameterized

Я использую его как

map.put(VARIABLE_NAME1, s -> s.getStringProperty());
map.put(VARIABLE_NAME2, s -> s.getIntProperty());
..

Я использую для сравнения, как

Comparator<CLASS_TYPE> v = Comparator.comparing(map.get(VARIABLE_NAME), Comparator.nullsFirst(Comparator.naturalOrder()));

Какой тип общего следует использовать, чтобы избежать предупреждения?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

В вашей текущей схеме есть несколько ошибок:

  1. Comparator и Comparable - это два разных подхода к сравнению объектов.Вы путаете их.
  2. Вы пытаетесь сохранить функцию, которая выполняет сравнения на карте.Позже вы выбираете значение с карты и пытаетесь сравнить его (функцию) с Comparator.Это не сработает, так как вы не можете сравнить функцию ни с чем, кроме другой функции.
  3. Фактически вы нигде не храните значение;вы только сохраняете функцию.
  4. В вашем примере вы храните два разных значения для одного и того же VARIABLE_NAME.Это намеренно?

Если вы хотите создать карту свойств, вам нужно создать хранимый объект, который можно сохранить на карте и сравнить его значение с предоставленным значением.Например,

class Storable<T extends Comparable<T>> {
  private final T value;
  Storable(T value) {
    this.value = value;
  }
  int compareTo(Object other) {
    if ( value.getClass().equals(other.getClass()) ) {
      return value.compareTo( (T) other );
    }
    return -1;
  }
}

Теперь создайте соответствующие подклассы:

class StorableInt extends Storable<Integer> {
    StorableInt(Integer t) {
        super(t);
    }
}
class StorableString extends Storable<String> {
    StorableString(String s) {
        super(s);
    }
}

Ваша карта свойств теперь выглядит следующим образом:

Map<String, Storable<?>>map = new HashMap<>();

map.put(variableName1, new StorableInt(13));
map.put(variableName2, new StorableString("string2"));

<T extends Comparable<T>> int compare( String key, T val ) {
  return map.get( key ).compareTo( val );
}

Теперь вы можете сохранять свойства вкарту и сравните значения с этими свойствами.

0 голосов
/ 20 декабря 2018

Comparable, очевидно, является универсальным типом.

Так что все, что вам нужно, это просто:

Map<String, Function<CLASS_NAME, Comparable<CLASSNAME>>> map = new HashMap<>();

вместо

Map<String, Function<CLASS_NAME, Comparable>> map = new HashMap<>();

или вы хотите сравнить другой тип..?

Map<String, Function<CLASS_NAME, Comparable<SomeOtherClass>>> map = new HashMap<>();
...