2016-08-16 9 views
1

Я нашел этот код в некоторой библиотеке:Неконвертируемые типы; не может быть выбрано 'Компаратор <T>' to 'Компаратор <? супер Object>»

public static <T> List<T> sort(
     Collection<T> collection, 
     Comparator<T> comparator) 
    { 
     Object[] a = collection.toArray(new Object[collection.size()]); 
     //noinspection unchecked 
     Arrays.sort(a, (Comparator<? super Object>) comparator); 
     return cast(Arrays.asList(a)); 
    } 

Моя шашка клянется

неконвертируемых типов; не может бросить java.util.Comparator<T> к 'java.util.Comparator<? super java.lang.Object>

При каких обстоятельствах этот код может работать?

+0

Это плохой код. Они должны были работать со списками и использовать 'Collections.sort' вместо использования массивов и полагаться на стирание, как это. – user2357112

+0

Это компиляция в javac и eclipse с предупреждением. Какой «контролер» вы используете? – shmosel

+0

Мой плохой; Теперь я понимаю, что это чужой ужасный код библиотеки. Он будет работать при любых обстоятельствах, поскольку вы гарантируете совместимость «Comparator» и «Collection». Это довольно неприятная реализация - она ​​может предшествовать дженерикам и была перенесена? –

ответ

1

Чтобы ответить на вопрос, код не может работать.

Я предлагаю сделать следующее изменение:

public static <T> List<T> sort(Collection<T> collection, Comparator<T> comparator) { 
    List<T> a = new ArrayList<T>(collection); 
    a.sort(comparator); 
    return a; 
} 

Это будет исправить ошибки компиляцию и грозных одним маха.

Отказ от ответственности: Код не может скомпилировать или работать, как это было в просмотрел на моем телефоне (но есть разумный шанс, что он будет работать)

+1

@boris старые привычки умереть сложно:/ – Bohemian

+0

Код не OP, и он не пытается его исправить. – shmosel

+2

Это сильно отличается от кода OP. Код OP возвращает отсортированную копию. Этот код сортирует список на месте (если коллекция представляет собой список). –