В чем разница между Collections.emptyList () и Collections.EMPTY_LIST

106

В Java у нас есть Collections.emptyList () и Collections.EMPTY_LIST . Оба имеют одно и то же свойство:

Возвращает пустой список (неизменяемый). Этот список можно сериализовать.

Так в чем же точная разница между тем и другим?

Poitroae
источник

Ответы:

131
  • Collections.EMPTY_LIST возвращает старый стиль List
  • Collections.emptyList() использует вывод типа и поэтому возвращает List<T>

Collections.emptyList () был добавлен в Java 1.5 и, вероятно, всегда предпочтительнее . Таким образом, вам не нужно без надобности перебирать код.

Collections.emptyList()по сути делает актерский состав за вас .

@SuppressWarnings("unchecked")
public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}
Poitroae
источник
1
Я не уверен в этом на 100%, но считаю, что использование / возврат нетипизированной версии (EMPTY_LIST / EMPTY_SET / EMPTY_MAP) заставляет компилятор отказываться от проверки типов универсальных типов в данной цепочке вызовов. По сути, он показывает, что забрел в старый код, в котором отсутствуют общие типы, и сдаётся.
Мэтт Пасселл,
18

Приступим к источнику:

 public static final List EMPTY_LIST = new EmptyList<>();

и

@SuppressWarnings("unchecked")
public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}
НимЧимпский
источник
13

Это абсолютно равные объекты.

public static final List EMPTY_LIST = new EmptyList<>();

public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}

Единственный - emptyList()возвращает общий List<T>, поэтому вы можете назначить этот список общей коллекции без каких-либо предупреждений.

Андремоний
источник
13

Другими словами, EMPTY_LIST небезопасен по типу:

  List list = Collections.EMPTY_LIST;
  Set set = Collections.EMPTY_SET;
  Map map = Collections.EMPTY_MAP;

По сравнению с:

    List<String> s = Collections.emptyList();
    Set<Long> l = Collections.emptySet();
    Map<Date, String> d = Collections.emptyMap();
mel3kings
источник