Jaka jest różnica między Collections.emptyList () i Collections.EMPTY_LIST

Odpowiedzi:

130
  • Collections.EMPTY_LIST zwraca stary styl List
  • Collections.emptyList() używa wnioskowania o typie i dlatego zwraca List<T>

Collection.emptyList () została dodana w Javie 1.5 i prawdopodobnie zawsze jest preferowana . W ten sposób nie musisz niepotrzebnie przesyłać w swoim kodzie.

Collections.emptyList()z natury rzeczy obsada za Ciebie .

@SuppressWarnings("unchecked")
public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}
poitroae
źródło
1
Nie jestem tego w 100% pewien, ale uważam, że użycie / zwrócenie wersji bez typu (EMPTY_LIST / EMPTY_SET / EMPTY_MAP) powoduje, że kompilator rezygnuje ze sprawdzania typów generycznych w danym łańcuchu wywołań. Zasadniczo wskazuje, że zawędrował do starego kodu pozbawionego typów ogólnych i poddaje się.
Matt Passell
18

Przejdźmy do źródła:

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

i

@SuppressWarnings("unchecked")
public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}
NimChimpsky
źródło
13

Są absolutnie równymi obiektami.

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

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

Jedynym jest emptyList()zwracanie ogólnej List<T>, więc możesz przypisać tę listę do ogólnej kolekcji bez żadnych ostrzeżeń.

Andremoniy
źródło
13

Innymi słowy, EMPTY_LIST nie jest bezpiecznym typem:

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

W porównaniu do:

    List<String> s = Collections.emptyList();
    Set<Long> l = Collections.emptySet();
    Map<Date, String> d = Collections.emptyMap();
mel3kings
źródło