Примечание: Это - ответвление от Сопоставимого и контракт Компаратора относительно пустого указателя
Этот код компилирует и хорошо работает в Eclipse (
20090920-1017
)import java.util.*; public class SortNull { static
> Comparator nullComparableComparator() { return new Comparator () { @Override public int compare(T el1, T el2) { return el1 == null ? -1 : el2 == null ? +1 : el1.compareTo(el2); } }; } public static void main(String[] args) { List numbers = new ArrayList ( Arrays.asList(3, 2, 1, null, null, 0) ); Comparator numbersComp = nullComparableComparator(); Collections.sort(numbers, numbersComp); System.out.println(numbers); // "[null, null, 0, 1, 2, 3]" List names = new ArrayList ( Arrays.asList("Bob", null, "Alice", "Carol") ); Comparator namesComp = nullComparableComparator(); Collections.sort(names, namesComp); System.out.println(names); // "[null, Alice, Bob, Carol]" } } И все же это не компилирует на
javac 1.6.0_17
. Это - сообщение об ошибке:SortNull.java:17: incompatible types; no instance(s) of type variable(s) T exist so that java.util.Comparator
conforms to java.util.Comparator found : java.util.Comparator required: java.util.Comparator Comparator numbersComp = nullComparableComparator(); SortNull.java:25: incompatible types; no instance(s) of type variable(s) T exist so that java.util.Comparator conforms to java.util.Comparator found : java.util.Comparator required: java.util.Comparator Comparator namesComp = nullComparableComparator(); 2 errors Кто-то может объяснить почему несоответствие? Действительно ли это - ошибка? Если так, у кого есть ошибка?
Это подтвержденная ошибка: ID ошибки 6468354 . Вот выдержка из релевантности:
Эта проблема вызвана тем фактом, что иногда реализация javac JLS3 15.12.2.8 игнорирует рекурсивные границы, иногда нет (как в этом случае). Когда рекурсивные границы содержат подстановочные знаки, такие границы включаются при вычислении переменных неизолированного типа. Это делает последующий тест подтипа
(Integer <: Comparable Super T>
, гдеT
- это переменная типа, которая должна быть выведена).Будет исправлено после 6369605
Также возникло на WinXP с 1.6.0_13. Хорошо, я просто буду использовать Eclipse :)
Вы можете обойти это, явно указав общий класс:
Comparator<String> namesComp = Stack.<String>nullComparableComparator();