Was ist der Unterschied zwischen Collections.emptyList () und Collections.EMPTY_LIST?

104

In Java haben wir Collections.emptyList () und Collections.EMPTY_LIST . Beide haben die gleiche Eigenschaft:

Gibt die leere Liste zurück (unveränderlich). Diese Liste ist serialisierbar.

Was ist also der genaue Unterschied zwischen der Verwendung der einen oder der anderen?

Poitroae
quelle

Antworten:

129
  • Collections.EMPTY_LIST gibt einen alten Stil zurück List
  • Collections.emptyList() verwendet Typinferenz und gibt daher zurück List<T>

Collections.emptyList () wurde in Java 1.5 hinzugefügt und ist wahrscheinlich immer vorzuziehen . Auf diese Weise müssen Sie nicht unnötig in Ihrem Code herumspielen.

Collections.emptyList()macht die Besetzung für Sie .

@SuppressWarnings("unchecked")
public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}
Poitroae
quelle
1
Ich bin mir dessen nicht 100% sicher, aber ich glaube, dass die Verwendung / Rückgabe der untypisierten Version (EMPTY_LIST / EMPTY_SET / EMPTY_MAP) dazu führt, dass der Compiler die Überprüfung des generischen Typs innerhalb der angegebenen Aufrufkette aufgibt. Es stellt sich im Wesentlichen heraus, dass es in alten Code ohne generische Typen gewandert ist und aufgibt.
Matt Passell
18

Kommen wir zur Quelle:

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

und

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

Sie sind absolut gleiche Objekte.

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

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

Die einzige ist, dass emptyList()generisch zurückgegeben wird List<T>, sodass Sie diese Liste ohne Warnungen der generischen Sammlung zuweisen können.

Andremoniy
quelle
13

Mit anderen Worten, EMPTY_LIST ist nicht typsicher:

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

Verglichen mit:

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