Дженерики компилируют и выполнения в Eclipse, но не компилируют в javac

Примечание: Это - ответвление от Сопоставимого и контракт Компаратора относительно пустого указателя

Этот код компилирует и хорошо работает в 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

Кто-то может объяснить почему несоответствие? Действительно ли это - ошибка? Если так, у кого есть ошибка?

23
задан Community 23 May 2017 в 12:00
поделиться

2 ответа

Это подтвержденная ошибка: ID ошибки 6468354 . Вот выдержка из релевантности:

Эта проблема вызвана тем фактом, что иногда реализация javac JLS3 15.12.2.8 игнорирует рекурсивные границы, иногда нет (как в этом случае). Когда рекурсивные границы содержат подстановочные знаки, такие границы включаются при вычислении переменных неизолированного типа. Это делает последующий тест подтипа (Integer <: Comparable , где T - это переменная типа, которая должна быть выведена).

Будет исправлено после 6369605

Также возникло на WinXP с 1.6.0_13. Хорошо, я просто буду использовать Eclipse :)

30
ответ дан 29 November 2019 в 01:45
поделиться

Вы можете обойти это, явно указав общий класс:

Comparator<String> namesComp = Stack.<String>nullComparableComparator();
16
ответ дан 29 November 2019 в 01:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: