Java: удаление предупреждения «Comparable is a raw type» - PullRequest
7 голосов
/ 10 августа 2011

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

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
}

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

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

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

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

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

РЕДАКТИРОВАТЬ: Могу ли я сделать это без изменения сигнатуры метода foo?

Ответы [ 5 ]

13 голосов
/ 10 августа 2011

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

@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.
}
3 голосов
/ 10 августа 2011

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

    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
инет Type safety: The method compareTo(Object) belongs to the raw type Comparable. References to generic type Comparable<T> should be parameterized

1 голос
/ 10 августа 2011

РЕДАКТИРОВАТЬ: Поскольку вы сказали, что вы не можете изменить сигнатуру метода, то вы действительно не можете обойтись без небезопасного (для компилятора) приведения и @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);
}
1 голос
/ 10 августа 2011

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

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

0 голосов
/ 10 августа 2011

Добавить аннотацию @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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...