Как разрешить непроверенный вызов CompareTo (T) без использования обобщений в Java - PullRequest
0 голосов
/ 09 марта 2019

Я хотел бы разрешить это предупреждение компилятора:

unchecked call to compareTo(T) as member of the raw type java.lang.Comparable

Моя цель - сравнить два java.lang.Object объекта неизвестного (фонового) типа, используя следующий метод.

public static boolean Compare(Object o1, Object o2) {
    //check if both classes are the same
    if(!o1.getClass().equals(o2.getClass())) {
       return false;
    } 

    if(Comparable.class.isAssignableFrom(o1.getClass()) 
        && Comparable.class.isAssignableFrom(o2.getClass())) {
       //only if both objects implement comparable
       return Comparable.class.cast(o1).compareTo(Comparable.class.cast(o2)) == 0;

    }
    //other comparison techniques...
}

Я знаю, что проблема в том, что метод приводит оба объекта к Comparable (Comparable<Object>), но Object не реализует Comparable.

Сам код работает ,но компилятор выдает предупреждение при использовании его параметра -Xlint: unchecked.

Цели:

  • удалить предупреждение компилятора
  • keep outдругих «непроверенных» предупреждений
  • избегая использования @ SupressWarning
  • keep метод сравнения не универсальный

1 Ответ

0 голосов
/ 14 марта 2019

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

    if(Comparable.class.isAssignableFrom(o1.getClass()) 
            && Comparable.class.isAssignableFrom(o2.getClass())) {
        // Cache this somewhere if you're really going to use it
        Method compareTo = Comparable.class.getMethod("compareTo", Object.class);
        Integer result = (Integer) compareTo.invoke(o1, o2);

        return result == 0;

    }

. Лучше всего по-прежнему использовать @SuppressWarnings один раз при преобразовании объектов и продолжать с этим.Если каким-то образом вы не можете гарантировать безопасность типов ваших параметров, вполне нормально использовать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...