Quelle est la différence entre Collections.emptyList () et Collections.EMPTY_LIST

Réponses:

130
  • Collections.EMPTY_LIST renvoie un style ancien List
  • Collections.emptyList() utilise l'inférence de type et renvoie donc List<T>

Collections.emptyList () a été ajouté dans Java 1.5 et il est probablement toujours préférable . De cette façon, vous n'avez pas besoin de balayer inutilement votre code.

Collections.emptyList()fait intrinsèquement le casting pour vous .

@SuppressWarnings("unchecked")
public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}
poitroae
la source
1
Je ne suis pas sûr à 100% de cela, mais je pense que l'utilisation / le retour de la version non typée (EMPTY_LIST / EMPTY_SET / EMPTY_MAP) fait que le compilateur abandonne la vérification de type générique dans la chaîne d'appels donnée. Il suppose essentiellement qu'il s'est égaré dans un ancien code dépourvu de types génériques et qu'il abandonne.
Matt Passell
18

Allons à la source:

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

et

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

Ce sont des objets absolument égaux.

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

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

Le seul est que emptyList()renvoie générique List<T>, vous pouvez donc affecter cette liste à une collection générique sans aucun avertissement.

Andremoniy
la source
13

En d'autres termes, EMPTY_LIST n'est pas de type sécurisé:

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

Par rapport à:

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