Collections.emptyList()和Collections.EMPTY_LIST有什么区别


Answers:


129
  • Collections.EMPTY_LIST 返回旧样式 List
  • Collections.emptyList() 使用类型推断,因此返回 List<T>

在Java 1.5中添加了Collections.emptyList(),它可能始终是首选。这样,您无需在代码中不必要地转换。

Collections.emptyList()从内在上为你做演员。

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

1
我不确定这是100%,但是我相信使用/返回无类型版本(EMPTY_LIST / EMPTY_SET / EMPTY_MAP)会使编译器放弃给定调用链中的泛型类型检查。它本质上认为它已经陷入缺乏通用类型的旧代码中并放弃了。
马特·帕瑟尔(Mat 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();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.