Collections.emptyList()とCollections.EMPTY_LISTの違いは何ですか


回答:


130
  • 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;
}

1
100%確実ではありませんが、型指定されていないバージョン(EMPTY_LIST / EMPTY_SET / EMPTY_MAP)を使用または返すと、コンパイラーは指定された呼び出しチェーン内のジェネリック型チェックを中止することになります。それは本質的にそれがジェネリック型を欠いている古いコードにぶらついて、あきらめたことを計算します。
Matt Passell、2015

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()generic を返すものなList<T>ので、警告なしにこのリストをGenericコレクションに割り当てることができます。


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();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.