¿Cuál es la diferencia entre Collections.emptyList () y Collections.EMPTY_LIST

Respuestas:

130
  • Collections.EMPTY_LIST devuelve un estilo antiguo List
  • Collections.emptyList() usa la inferencia de tipo y, por lo tanto, devuelve List<T>

Collections.emptyList () se agregó en Java 1.5 y probablemente siempre sea preferible . De esta manera, no es necesario realizar búsquedas innecesarias en su código.

Collections.emptyList()intrínsecamente lo hace por ti .

@SuppressWarnings("unchecked")
public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}
poitroae
fuente
1
No estoy 100% seguro de esto, pero creo que usar / devolver la versión sin tipo (EMPTY_LIST / EMPTY_SET / EMPTY_MAP) hace que el compilador abandone la verificación de tipos genéricos dentro de la cadena de llamadas dada. Básicamente, imagina que se ha adentrado en un código antiguo que carece de tipos genéricos y se rinde.
Matt Passell
18

Vayamos a la fuente:

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

y

@SuppressWarnings("unchecked")
public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}
NimChimpsky
fuente
13

Son objetos absolutamente iguales.

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

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

El único es que emptyList()devuelve genérico List<T>, por lo que puede asignar esta lista a la colección genérica sin advertencias.

Andremoniy
fuente
13

En otras palabras, EMPTY_LIST no es seguro de tipos:

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

En comparación con:

    List<String> s = Collections.emptyList();
    Set<Long> l = Collections.emptySet();
    Map<Date, String> d = Collections.emptyMap();
mel3kings
fuente