อะไรคือความแตกต่างระหว่าง Collections.emptyList () และ Collections.EMPTY_LIST


106

ใน Java เรามีCollections.emptyList ()และCollections.EMPTY_LIST ทั้งสองมีคุณสมบัติเหมือนกัน:

ส่งคืนรายการว่าง (ไม่เปลี่ยนรูป) รายการนี้สามารถต่ออนุกรมได้

แล้วความแตกต่างที่แน่นอนระหว่างการใช้อันอื่นคืออะไร

คำตอบ:


131
  • Collections.EMPTY_LIST ส่งคืนรูปแบบเก่า List
  • Collections.emptyList() ใช้การอนุมานประเภทจึงส่งกลับ List<T>

Collections.emptyList () ถูกเพิ่มเข้ามาในเกาะชวา 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) ทำให้คอมไพเลอร์ยอมแพ้ในการตรวจสอบประเภท generics ภายในสายการโทรที่กำหนด โดยพื้นฐานแล้วตัวเลขได้หลงเข้าไปในรหัสเก่าโดยขาดประเภททั่วไปและยอมแพ้
Matt Passell

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()ส่งคืนค่าทั่วไปList<T>ดังนั้นคุณสามารถกำหนดรายการนี้ให้กับคอลเล็กชันทั่วไปโดยไม่มีคำเตือนใด ๆ


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.