Я только что попробовал это:
public static <T extends Comparable> int compareObject(T o1, T o2) {
if ((o1 instanceof String) && (o2 instanceof String))
return ((String) o1).toUpperCase().compareTo(((String) o2).toUpperCase());
else
return o1.compareTo(o2);
}
Компилируется, но выдает непроверенное предупреждение о приведении при вызове compareTo ().
Я попытался изменить его на
public static <T extends Comparable<T>> int compareObject(T o1, T o2) {
и проверки строк не удалось скомпилировать («необратимые типы: найдено: T, требуется: строка»). Я думаю, что это должно быть близко, хотя.
РЕДАКТИРОВАТЬ: Как указано в комментариях, это ошибка в javac . Вторая форма действительно верна, но в настоящее время не компилируется. Как ни странно, этот код работает без предупреждений:
public static <T extends Comparable<T>> int compareObject(T o1, T o2) {
if (((Object) o1 instanceof String) && ((Object) o2 instanceof String))
return ((String) (Object)o1).toUpperCase().compareTo(((String) (Object)o2).toUpperCase());
else
return o1.compareTo(o2);
}
Как видите, единственное различие заключается во всех избыточных приведениях к Object
.