Java: удаление предупреждения" Comparable is a raw type"

предположим, что у меня есть метод foo, принимающий 2 объекта в качестве параметра. Оба объекта имеют один и тот же тип, и оба реализуют сопоставимый интерфейс.

void foo(Object first, Object second){

    if (!first.getClass().isInstance(second))   //first and second of the same type
        return;

    Comparable firstComparable = (Comparable)first;  //WARNING
    Comparable secondComparable = (Comparable)second;  //WARNING

    int diff = firstComparable.compareTo(secondComparable);  //WARNING
}

первые 2 предупреждения:

Comparable является необработанным типом. Ссылки на сопоставимый общий тип должно быть параметризовано

последнее предупреждение:

безопасность типов: метод compareTo (Object) принадлежит типу raw Сходный. Ссылки на общие тип Comparable должен быть параметризованный

Как я могу рефакторинг мой код, чтобы убрать эти предупреждения?

изменить: Могу ли я сделать это без изменения подписи метода foo?

5 ответов


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

@SuppressWarnings("unchecked")
static void foo(Object first, Object second) {
    foo((Comparable) first, (Comparable) second);
}

static <T extends Comparable<T>> void foo(T first, T second){
    int diff = first.compareTo(second); // no warning.
}

без изменения подписи вы можете сделать

    void foo(Object first, Object second){

        if (!first.getClass().isInstance(second)) 
            return;

        Comparable<Object> firstComparable = (Comparable<Object>)first;  
        Comparable<Object> secondComparable = (Comparable<Object>)second; 

        int diff = firstComparable.compareTo(secondComparable);  
    }

но у вас все еще есть:
Type safety: Unchecked cast from Object to Comparable<Object>

а не Comparable is a raw type. References to generic type Comparable<T> should be parameterized
и нет!--3-->


вы должны использовать Comparable<Type> где Type-объект, реализующий Comparable.

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


EDIT: поскольку вы сказали, что не можете изменить подпись метода, то вы действительно не можете уйти без небезопасного (для компилятора) приведения и @SuppressWarnings:

@SuppressWarnings("unchecked")
public void foo(final Object first, final Object second) {
    if (!first.getClass().isInstance(second)) // first and second of the
        return;

    Comparable<Object> firstComparable = (Comparable<Object>) first;
    Comparable<Object> secondComparable = (Comparable<Object>) second;
    int diff = firstComparable.compareTo(secondComparable);
}

добавить аннотацию @SuppressWarnings.

@SuppressWarnings("unchecked")
void foo(Object first, Object second){

    if (!first.getClass().isInstance(second))   //first and second of the same type
        return;

    Comparable firstComparable = (Comparable)first;  //WARNING
    Comparable secondComparable = (Comparable)second;  //WARNING

    @SuppressWarnings("unused")
    int diff = firstComparable.compareTo(secondComparable);  //WARNING
}