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
}